在JavaScript中创建干净,可继承的对象

时间:2014-12-23 16:44:28

标签: javascript oop inheritance underscore.js prototype

我正在使用一个相当大的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}似乎不知道MyMammalMyDog的原型{1}}虽然它确实认识到isPrototypeOf的实例是MyDog

据我了解,除了能够轻松创建子类的传统优势之外,JavaScript原型还共享功能,因此使用它们应该更有效。我的问题首先是这个模型是否能够利用它(我不能理解为什么它不会,但那就是我要问的原因),其次是否有将这种类型的结构用于大型JS应用程序的代码的任何主要缺点?我试图以惯用的JavaScript方式工作,而且我并不担心保密我的本地变量。

1 个答案:

答案 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.
 }