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