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
作为 属性,并且它是与您添加到 x
的 foo
属性 不同,您刚刚添加
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'
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
作为 属性,并且它是与您添加到 x
的 foo
属性 不同,您刚刚添加
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'