2

当我们使用原型时。我们使用喜欢

function classA(){

}
function classB(){

}

classB.prototype = new classA();

我们为什么要这样写?为什么不是?

classB.prototype = classA;

我设置原型后是classA;然后我记录classB.prototype。控制台日志如下

函数类A(){}

那是什么意思?我尝试在 classA 中添加一些方法,但我无法使用 classB.prototype.BLABLA 调用它们。

我的英语不怎么好。所以 。我不知道我解释得好不好。

4

3 回答 3

3

为什么不是?classB.prototype = classA;

因为 的所有实例都classB将继承自通常不是您想要的函数。 classA的实例classB将继承函数对象的所有属性,例如.call [MDN].apply [MDN]。它们不会继承您分配给构造函数内部实例或classA.

我们为什么要这样写?

您希望每个实例classB具有与.classA


但即使classB.prototype = new classA();不是一个很好的方法。如果classA期望传递给构造函数的参数怎么办?

最好让classB继承自classA原型的实例,例如:

classB.prototype = Object.create(classA.prototype);
classB.prototype.constructor = classB;

在构造函数中,您在新实例上调用父构造函数:

function classB(){
    classA.apply(this, arguments);
}

参考Object.create

于 2012-06-19T10:59:45.187 回答
1

为什么原型需要一个实例而不是函数自身

这就是允许您从父类扩展子类或在子类中获取父类的东西的原因。这与其他语言中从父类获取东西的概念相同,子类必须在其构造函数中创建它的实例。

如果不创建实例,您将无法在子类中获取父类的成员。

观察:

function classA(){
  this.foo = function(){ alert('i am in parent'); }
}
function classB(){

}

classB.prototype = new classA();

var b = new classB;
b.foo(); // alerts "foo"

和:

function classA(){
  this.foo = function(){ alert('i am in parent'); }
}
function classB(){

}

classB.prototype = classA();

var b = classB;
b.foo(); // error: Object # has no method 'foo'
于 2012-06-19T10:56:09.197 回答
1

仅仅因为原型是一个对象,而不是一个函数。

classA是一个函数,所以你不要将它用作原型。您创建一个实例,classA以便获得一个对象。

由于函数实际上也是一个对象,因此您可以将函数用作原型,但这只会令人困惑。

于 2012-06-19T11:01:41.540 回答