为什么对象文字可以访问对象原型的属性?



在阅读Processional JavaScript for Web Developers第4版时,我发现了这样一句话:

当通过对象文字符号定义对象时,从未实际调用过对象构造函数。

但是如果对象文字不是通过Object构造函数创建的,它如何访问Object.prototype的属性?

像这样:

Object.prototype.a = 1
let obj = {}
console.log(obj.a)      // 1

或者有人能告诉我这本书的结论是怎么得出的吗?我在ECMAScript规范中没有找到任何关于这方面的内容。

引用MDN

对象被创建,就好像调用了new Object((;即,由对象文字表达式组成的对象是object的实例。

因此,在您的代码中,obj"自动"变为Object的实例。

代码中Object.prototype.a的赋值将创建a,作为从随后创建的Object(在js中,即:everything(继承的所有内容的属性。

Object.prototype.a = 'I am the one';
let obj = {};
let Constrctr = function(aa = this.a) {
//                          ^ QED
this.aa = aa;

};
let obj2 = new Constrctr();
let obj3 = new Constrctr(2);
let someArray = new Array();
let someArrayLiteral = [];
let someNumber = new Number();
let someNumberLiteral = 42;
let someRegex = new RegExp();
let someString = new String();
let someStringLiteral = "";
let someFunction = () => {};
document.querySelector('pre').innerHTML = `<h2><i>Everything</i></h2>obj.a: ${obj.a},
obj2.aa: ${obj2.aa}, 
obj2.a: ${obj2.a},
obj3.aa: ${obj3.aa},
obj3.a: ${obj3.a},
someNumber.a: ${someNumber.a},
someNumberLiteral.a: ${someNumberLiteral.a},
someArray.a: ${someArray.a},
someArrayLiteral.a: ${someArray.a},
someRegex.a: ${someRegex.a},
someString.a: ${someString.a},
someStringLiteral.a: ${someStringLiteral.a},
someFunction.a: ${someFunction.a}`;
<pre></pre>

最新更新