【问题标题】:Why object literal can access the property of Object's prototype?为什么对象字面量可以访问对象原型的属性?
【发布时间】:2021-09-19 14:11:22
【问题描述】:

在阅读面向 Web 开发人员的 Processional JavaScript 第 4 版时,我发现了这样一句话:

当通过对象字面量表示法定义对象时,Object 构造函数永远不会被实际调用。

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

像这样:

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

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

【问题讨论】:

  • 它不必调用构造函数来获得原型。
  • {} 没有显式调用 any 构造函数,但它是某事的一个实例。这在幕后隐含地发生。
  • @CherryDT 你的意思是它有自己的方式来连接Object.prototype?
  • 你也可以这样做,你可以使用Object.setPrototypeOf设置一些东西的原型。
  • It 调用 OrdinaryObjectCreate(如 Object.create() btw),它不调用 Object 构造函数。

标签: javascript object prototype


【解决方案1】:

致quote 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}`;
&lt;pre&gt;&lt;/pre&gt;

【讨论】:

    猜你喜欢
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多