澄清:Javascript原型更新混乱

澄清:Javascript原型更新混乱,javascript,prototype,Javascript,Prototype,,但答案显示了观察到的情况,但并不能解释为什么会这样 让我们创建三个函数构造函数 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原型接收属性

,但答案显示了观察到的情况,但并不能解释为什么会这样

让我们创建三个函数构造函数

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分配任何特定的原型属性,因此继承链被断开

这是否意味着一旦对象被创建,它就被绑定到任何东西上 原型是在创建过程中分配的吗

是的,没错。对象从其[[Prototype]]内部属性中的对象继承属性

该属性在创建实例时设置:

设proto是使用参数prototype调用F的[[Get]]内部属性的值。 如果proto是Object,则将obj的[[Prototype]]内部属性设置为proto。 但是,如果更改构造函数的prototype属性,则不会影响以前的实例

事实上,prototype本身并不特殊,只是[[Construct]]内部方法在创建实例时使用它

一旦对象被创建,它就被绑定到任何原型上 在创建期间分配

基本上是的。您可以使用以下方法进行更改,但由于性能问题,不建议您进行更改:

__proto_uuz:这是Object.prototype中的一个非标准属性,可以用作[[prototype]]的getter或setter。附录B中的ECMAScript 6 Web浏览器的附加ECMAScript功能

,ECMAScript 6引入的一种新方法


如果只更改构造函数原型属性就可以从多个对象获取更新,不是更好吗?不,不会。@zerkms,所以一旦创建了对象,它就绑定到一个特定的原型,只接收来自该原型的更新,而不接收其他任何更新。这很好。这就是可预测代码的行为。是的,已经测试过了“proto”可用于将对象的原型更改为其他对象。但它正在更改“构造函数”属性。真奇怪。