在阅读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>