我知道你可以让一个 javascript 实例化对象继承另一个构造函数的原型constructer.prototype.__proto__ = otherConstructer.prototype
,但是你可以使用这样的call
方法来做同样的事情吗?:
function constructor () {
otherConstructor.call(this);
}
我知道你可以让一个 javascript 实例化对象继承另一个构造函数的原型constructer.prototype.__proto__ = otherConstructer.prototype
,但是你可以使用这样的call
方法来做同样的事情吗?:
function constructor () {
otherConstructor.call(this);
}
不,原型不能被替换,除非引用对象本身并直接用 __proto__ 属性替换它,这在所有实现中都不存在。看这个示例代码:
function B() {
this.someValue = "BBB";
}
B.prototype.testfunc = function() {
console.log("Called from B: someValue =" + this.someValue);
}
function A() {
this.someValue = "AAA";
return B.call(this);
}
A.prototype.testfunc = function() {
console.log("Called from A: someValue =" + this.someValue);
}
var test = new A();
test.testfunc();
// Will output "Called from A: someValue =BBB"
如您所见,B 构造函数被正确调用,对象设置来自 B 而不是 A,但对象的原型仍然来自 A。当然,您可以替换单个函数:
test.testfunc = B.prototype.testfunc;
test.testfunc();
// Will output "Called from A: someValue =BBB"
如果您想很好地解释为什么会这样,请查看此问题的已接受答案。
编辑:创建 A 对象时,与 B.prototype 没有关联。如果你修改了代码使得 A.prototype.testfunc 没有被定义,那么即使 A 构造函数调用了 B,调用 test.testfunc() 也会导致一个未定义的异常。