我正在使用一个相当大的JavaScript项目并尝试重构它以说服它以更多JavaScripty方式运行。我真正想要引入的一件事是提供继承,因为这非常适合我正在做的大部分工作,但是以易于阅读和遵循的方式使用原型和继承似乎有点困难。没有解决JavaScript问题。
我必须这样:
MyMammal = function( name ) {
if ( 0 < arguments.length )
{
this.init(name);
}
}
MyMammal.prototype= {
init: function( name ) {
this.name= name;
},
getName: function() {
return this.name;
}
}
然后,对于派生自MyMammal
的类,我按照这种方式工作:
MyDog = function( name, breed ) {
if ( 0 < arguments.length )
{
this.init( name, breed );
}
}
MyDog.prototype = Object.create( MyMammal.prototype );
_.extend( MyDog.prototype, {
init: function( name, breed )
{
this.name = name;
this.breed = breed;
},
getBreed: function()
{
return this.breed;
}
});
现在这可以解决方法调用我得到的结果,但是如果我尝试使用{{JavaScript}似乎不知道MyMammal
是MyDog
的原型{1}}虽然它确实认识到isPrototypeOf
的实例是MyDog
。
据我了解,除了能够轻松创建子类的传统优势之外,JavaScript原型还共享功能,因此使用它们应该更有效。我的问题首先是这个模型是否能够利用它(我不能理解为什么它不会,但那就是我要问的原因),其次是否有将这种类型的结构用于大型JS应用程序的代码的任何主要缺点?我试图以惯用的JavaScript方式工作,而且我并不担心保密我的本地变量。
答案 0 :(得分:1)
例如:
MyMammal = function( name ) {
if ( 0 < arguments.length )
{
this.init(name);
}
}
MyMammal.prototype= {
init: function( name ) {
this.name= name;
},
getName: retrieveNameOfMammal}; //here is where the fun happens
function retrieveNameOfMammal()
{
return this.name;
}
MyDog = function( name, breed ) {
MyMammal.apply(this, name); //this will apply all properties and functions from MyMammal, so you do not have to recreate this.init every time.
}