0

我知道你可以让一个 javascript 实例化对象继承另一个构造函数的原型constructer.prototype.__proto__ = otherConstructer.prototype,但是你可以使用这样的call方法来做同样的事情吗?:

function constructor () {
  otherConstructor.call(this);
}
4

1 回答 1

1

不,原型不能被替换,除非引用对象本身并直接用 __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() 也会导致一个未定义的异常。

于 2012-10-10T04:50:10.343 回答