澄清:Javascript 原型更新混乱
Clarification: Javascript prototype update confusion
Possible answer,但答案显示了观察到的内容,但没有解释为什么会这样。
让我们创建三个函数构造函数。
function A() {
}
function B() {
}
function C() {
}
C.prototype.nm = "C";
B.prototype = new A()
var obj = new B()
B.prototype = new C()
console.log(obj.nm); // prints, undefined.
所以在最后一行之后我期待 'obj' 从 C 的原型接收属性,但事实并非如此。那么这是否意味着一旦创建了对象,它就与创建期间分配给它的任何原型相关联?为什么会这样,我的意思是我可以通过原型接收对象的实时更新,但是如果可以从多个对象获取更新只是改变构造函数原型 属性 不是更好吗?
您没有为 B 分配任何特定的原型属性,因此继承链被破坏。
Does it mean that once the object is created it is tied to whatever
prototype it was assigned during creation ?
是的,没错。对象从其 [[Prototype]] 内部 属性.
中的对象继承属性
创建实例时设置 属性:
- Let proto be the value of calling the [[Get]] internal property of F with argument
"prototype"
.
- If Type(proto) is Object, set the [[Prototype]] internal property of obj to proto.
但是如果你改变构造函数的prototype
属性,它不会影响以前的实例。
其实prototype
本身并没有什么特别之处,只是[[Construct]]内部方法在创建实例时使用了它
once the object is created it is tied to whatever prototype it was
assigned during creation ?
大部分是。您可以更改它,但不推荐(因为性能问题),使用:
__proto__
:这是 Object.prototype
中的非标准 属性,可用作 getter 或 setter [[原型]]。附件 B 中的 ECMAScript 6 standardized it(Web 浏览器的附加 ECMAScript 功能)。
Object.setPrototypeOf
,ECMAScript 6引入的新方法
Possible answer,但答案显示了观察到的内容,但没有解释为什么会这样。
让我们创建三个函数构造函数。
function A() {
}
function B() {
}
function C() {
}
C.prototype.nm = "C";
B.prototype = new A()
var obj = new B()
B.prototype = new C()
console.log(obj.nm); // prints, undefined.
所以在最后一行之后我期待 'obj' 从 C 的原型接收属性,但事实并非如此。那么这是否意味着一旦创建了对象,它就与创建期间分配给它的任何原型相关联?为什么会这样,我的意思是我可以通过原型接收对象的实时更新,但是如果可以从多个对象获取更新只是改变构造函数原型 属性 不是更好吗?
您没有为 B 分配任何特定的原型属性,因此继承链被破坏。
Does it mean that once the object is created it is tied to whatever prototype it was assigned during creation ?
是的,没错。对象从其 [[Prototype]] 内部 属性.
中的对象继承属性创建实例时设置 属性:
- Let proto be the value of calling the [[Get]] internal property of F with argument
"prototype"
.- If Type(proto) is Object, set the [[Prototype]] internal property of obj to proto.
但是如果你改变构造函数的prototype
属性,它不会影响以前的实例。
其实prototype
本身并没有什么特别之处,只是[[Construct]]内部方法在创建实例时使用了它
once the object is created it is tied to whatever prototype it was assigned during creation ?
大部分是。您可以更改它,但不推荐(因为性能问题),使用:
__proto__
:这是Object.prototype
中的非标准 属性,可用作 getter 或 setter [[原型]]。附件 B 中的 ECMAScript 6 standardized it(Web 浏览器的附加 ECMAScript 功能)。Object.setPrototypeOf
,ECMAScript 6引入的新方法