javascript—为什么object literal可以访问对象原型的属性?

xxhby3vn  于 2021-09-23  发布在  Java
关注(0)|答案(1)|浏览(197)

在阅读第4版web开发者的过程javascript时,我发现了这样一句话:
当通过对象文字符号定义对象时,永远不会实际调用对象构造函数。
但是如果对象文字不是通过 Object 构造函数,它如何访问 Object.prototype ?
这样地:

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

或者谁能告诉我这本书给出的结论是如何得出的?我在ecmascript规范中没有找到任何与此相关的内容。

4xrmg8kj

4xrmg8kj1#

引用mdn
对象的创建就像调用了new object()一样;也就是说,由对象文字表达式生成的对象是对象的示例。
那么,在你的代码中 obj “自动”成为 Object .
分配 Object.prototype.a 在您的代码中将创建 a 作为一切继承物的财产 Object (在js中,即:所有内容)随后创建。

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>

相关问题