当我们使用原型时。我们使用像
function classA(){
}
function classB(){
}
classB.prototype = new classA();
我们为什么要这样写呢?为什么不呢?
classB.prototype = classA;
我设置原型后是classA;然后我记录classB.prototype。控制台日志如下
function classA(){ }
这是什么意思?我尝试在classA中添加一些方法,但我不能通过使用classB.prototype.BLABLA来调用它们。我的英语不太好。所以。我不知道我是否解释得很好。
答案 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);
}
答案 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
的实例,以便获得对象。
由于函数实际上也是一个对象,可以使用函数作为原型,但这只会让人感到困惑。