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

时间:2012-06-19 10:53:19

标签: javascript

当我们使用原型时。我们使用像

function classA(){

}
function classB(){

}

classB.prototype = new classA();

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

classB.prototype = classA;

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

function classA(){ }

这是什么意思?我尝试在classA中添加一些方法,但我不能通过使用classB.prototype.BLABLA来调用它们。

我的英语不太好。所以。我不知道我是否解释得很好。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

  

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

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

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

观察:

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'

答案 2 :(得分:1)

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

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

由于函数实际上也是一个对象,可以使用函数作为原型,但这只会让人感到困惑。