Javascript foo.prototype.x=&;之间的差异;foo.prototype={x:}
我不明白为什么fooA和fooB的结果不同Javascript foo.prototype.x=&;之间的差异;foo.prototype={x:},javascript,prototype,Javascript,Prototype,我不明白为什么fooA和fooB的结果不同 var foo = function(){} fooA = new foo(); foo.prototype.x = 1; foo.prototype = { y: 2, z: 3}; console.log(fooA.x, fooA.y, fooA.z);// 1, undefined, undefined fooB = new foo(); console.log(fooB.x, fooB.y, fooB.z);// undefined,
var foo = function(){}
fooA = new foo();
foo.prototype.x = 1;
foo.prototype = { y: 2, z: 3};
console.log(fooA.x, fooA.y, fooA.z);// 1, undefined, undefined
fooB = new foo();
console.log(fooB.x, fooB.y, fooB.z);// undefined, 2, 3
var foo = function(){}
fooA = new foo();
foo.prototype.x = 1;
console.log(fooA.__proto__) // {x:1}
foo.prototype = { y: 2, z: 3};
console.log(fooA.__proto__) // still {x:1}
对象的原型在创建时分配(当调用new
时),之后不会更改。
有关详细信息,请参见。该行为的原因是,在使用
foo.prototype={y:2,z:3}时,使foo.prototype
指向一个新对象当构造函数的prototype
属性设置为新值时,现有对象的原型不会更改
逐行解释发生的情况:
var foo=function(){}
foo.prototype
初始化为空对象(我们将此对象称为A
)
fooA=new foo()
fooA
设置为新的foo对象,其原型设置为foo.prototype
(a
)
foo.prototype.x=1
因为fooA
的原型是与foo.prototype
相同的对象,fooA.x
变为1。换句话说,A
获取属性x=1
foo.prototype={y:2,z:3}代码>
我们创建一个新对象,该对象的属性为y=2
和z=3
。我们将这个对象称为B
foo.prototype
设置为新对象
console.log(fooA.x、fooA.y、fooA.z)代码>
fooA
的原型仍然是A
,它只有x=1
属性
fooB=newfoo()代码>
我们创建了一个新的foo对象,其原型是B
console.log(fooB.x、fooB.y、fooB.z)代码>
fooB
的原型是B
,它有属性y=2
和z=3
,但没有属性x
F.prototype = { ... };
替换构造函数F
的prototype
对象。旧的prototype
对象被新的prototype
对象替换
F
var f = new F();
有一个隐式的原型链接,该链接引用构造函数F
的prototype
对象。但是,此引用是在实例初始化期间建立的
比如说
var f1 = new F();
F.prototype = { ... };
var f2 = new F();
这里,f1
的原型链接指的是旧的prototype
对象,而f2
的原型链接指的是新的prototype
对象
请注意,即使替换了F.prototype
对象,只要至少有一个F
的实例的prototype链接引用它,旧的prototype
对象将继续存在。
实际上是将Foo
重新定义为一个对象,您只是被夹在更改前后定义的实例之间。使用console.log(FooA);控制台日志(FooB)代码>以清楚地看到差异。