我对 javascript 中的以下原型(prototype)行为感到困惑。
function A(){
};
A.prototype.toString = function(){
console.log('first');
}
var a = new A(), b;
A.prototype = {
toString:function(){
console.log('second');
}
}
b = new A();
a.toString();
//outputs : first
b.toString();
//outputs : second
与打印“second”的b.toString 相比,为什么a.toString 仍然打印“frist”。 谁能解释一下我在这里缺少什么。
最佳答案
原型(prototype)链接与构造的构造函数无关 对象,它存储在对象本身上。
当您调用 new A()
时,会发生这种情况:
var a = {};
a.__proto__ = A.prototype;
A.call(a);
请注意,以上不是标准语法,但可以在 chrome 和 firefox 中使用。
因此,当您覆盖 A.prototype
时,a.__proto__
仍然链接到旧的 A.prototype
,正如您所期望的那样
代码:
var A = 10, a, b;
a = A;
A = 7; //a is still 10
b = A;
我不建议重新分配原型(prototype),因为那样你需要重新建立构造函数属性并且需要额外的缩进级别。
如果你想减少输入,只需存储对原型(prototype)的引用:
function A() {
}
var fn = A.prototype;
fn.toString = function() {
};
fn.valueOf = function() {
};
fn.toJSON = function() {
};
关于javascript - javascript中的原型(prototype)行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17179603/