constructor.prototype.property 在 Javascript 中做什么?

What does constructor.prototype.property do in Javascript?

var x = { foo: "A" };
x.constructor.prototype.foo = "B";
var y = {};

经过运行这段代码x.fooreturns"A"这就明白了。但是 y.foo returns "B" 即使 y 是一个空对象。我很想知道 x.constructor.prototype.foo 实际上是做什么的?

先谢谢大家了。

对象的constructor属性指向构造该对象的构造函数。您的 x 变量是一个对象文字,因此由 Object() 构造函数构造。因此,访问 x.constructor.prototype 与访问 Object.prototype.

相同

所有构造函数都有一个 prototype 属性 构成原型链的一部分。基本上,当您尝试访问任何对象的 属性 时 属性 实际上是 not 在对象上定义,然后 JavaScript 引擎会跟随原型链向后查看 属性 是否在链中的原型上定义。

因为您的 y 变量是 也是 对象文字,因此也是由 Object() 构造的,当您尝试访问 y.foo,因为 foo 属性 在 y 存在,原型链搜索开始,立即命中 Object.prototype.foo ,如您所知,已分配给 "B".

来自docs

Returns a reference to the Object function that created the instance's prototype

换句话说,所有对象现在都会有一个 foo 属性,因为您在对象原型上添加了 foo 作为 属性,并且它是与您添加到 xfoo 属性 不同,您刚刚添加

var x = { foo: "A" };
Object.prototype.foo = "B"; // all objects from now on inherits this
var y = {};

x.constructor 指的是 Object(因为所有对象文字都引用了 Object 分配给它们的 constructor 预定义 属性)。

Object.prototype 被赋予 属性 foo 和赋值 "B".

y 是对象字面量,因此它是内部的 [[Prototype]] 属性(在某些引擎中可用作 __proto__)指的是 Object.prototype.

由于JavaScript的原型继承,每次请求对象的属性,而这个对象不包含[=36​​=],引擎都会向上查找原型链。

因此,当访问 y.foo 时 - 因为 y 没有名为 foo 的 属性 - 您正在访问 y.[[Prototype]].foo,这正是 Object.prototype.foo .

发生这种情况是因为当您这样做时

var x = {foo: 'A'};

js 已经用构造函数 Object() 创建了一个对象,您可以通过输入

来验证它
x.constructor

它将在控制台中写入 function Object () {}。

现在您要进一步访问对象 class 的原型并在其中添加 'foo' 属性。

此时您的对象 class 有一个名为 'foo' 的新 属性。

现在您已经创建了一个新对象并用 y 引用了它。现在 y 是使用包含 'foo' 属性.

的对象构造函数创建的

这里原型继承也开始了。因为你在 y 中没有任何 属性 它开始在原型层次结构中寻找 'foo' 并且 'foo' 在最以及当它到达层次结构中的对象时。

如果你会写:

var y = {foo: 'C'};

y.foo 会给你输出 'C'