Javascript 为什么原型需要实例而不是函数本身

Javascript 为什么原型需要实例而不是函数本身,javascript,Javascript,当我们使用原型时。我们使用like function classA(){ } function classB(){ } classB.prototype = new classA(); 我们为什么要这样写呢?为什么不是呢 classB.prototype = classA; 我设置后的原型是classA;然后我记录classB.prototype。控制台日志如下所示 函数classA(){ } 那是什么意思?我试图在classA中添加一些方法,但我无法使用classB.prototyp

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

function classA(){

}
function classB(){

}

classB.prototype = new classA();
我们为什么要这样写呢?为什么不是呢

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

函数classA(){ }

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

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

为什么原型需要实例而不是函数本身

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

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

注意:

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

}

classB.prototype = new classA();

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

为什么不是呢<代码>classB.prototype=classA

因为
classB
的所有实例都将继承自函数
classA
,这通常不是您想要的。
classB
的实例将继承函数对象的所有属性,例如和。它们不会继承您分配给构造函数内实例或
classA
原型的属性

我们为什么要这样写呢

您希望
classB
的每个实例具有与
classA
实例相同的属性


但是甚至
classB.prototype=newclassa()不是一个很好的方法。如果
classA
需要传递给构造函数的参数,该怎么办

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

classB.prototype = Object.create(classA.prototype);
classB.prototype.constructor = classB;
在构造函数中,您正在对新实例调用父构造函数:

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

参考

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

classA
是一个函数,因此您不需要将其用作原型。创建
classA
的实例,以便获得一个对象


因为函数实际上也是一个对象,你可以使用函数作为原型,但那只会让人困惑。

@gdoron:是的,我应该少加评论,多提供答案:D只是有时候我觉得,愿意投入更多时间的人可能会提供更好的……请注意,如果浏览器不支持默认情况下的
Object.create
,您可以使用
if(typeof Object.create!='function'){Object.create=function(o){var F=function(){}创建自己的(Douglas Crockford的优秀部分);F.prototype=o;return new F();};
在他的问题中,他要求的
classB.prototype=classA
与您的答案不同:
classB.prototype=classA();
很抱歉打扰您……这是因为JavaScript不是面向对象的(在这种情况下,您继承自类,即JS中的函数),但它是面向原型的(您继承自对象)。prototype一词的结果是:“以prototype为基础创建新对象”.@freakish:JavaScript是面向对象的,它只是没有基于类的继承。@FelixKling:嗯,实际上这只是一个文字问题。对我来说,面向对象编程总是包括类继承。这种观点也在维基上得到普及。@freakish:是的,术语总是有争议的;)但维基百科也有:“基于原型的编程是面向对象编程的一种风格…”。总之,我明白你的意思。@freakish谢谢你的回答。但是我做了一些实验来弄清楚使用classB时发生了什么。Prototype=classA;我再次编辑了这个问题。你能帮我吗。?thx很多。:)
function classB(){
    classA.apply(this, arguments);
}