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

Creating clean, inheritable objects in JavaScript

本文关键字:可继承 对象 JavaScript 创建      更新时间:2023-09-26

我正在使用一个相当大的JavaScript项目,并试图重构它以说服它以更像JavaScript的方式运行。我真正想引入的一件事是使继承可用,因为这非常适合我正在做的大部分工作,但是以一种易于阅读和遵循的方式使用原型和继承似乎有点困难,而不会溶解到 JavaScript jam 中。

我有这样的事情:

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;
    }
});

现在,只要我从方法调用中获得我期望的结果,这就可以工作,但是如果我尝试使用isPrototypeOf,JavaScript 似乎不知道MyMammalMyDog的原型,尽管它确实认识到MyDog的实例是一个instanceof MyMammal

据我了解,除了能够轻松创建子类的传统优势外,JavaScript 原型还共享函数,因此很好地使用它们应该更节省内存。我的问题是首先这个模型是否能够利用这一点(我不明白为什么它不会,但这就是我问的原因(,其次,将这种类型的结构用于大型 JS 应用程序的代码是否有任何重大缺点? 我正在尝试以惯用的JavaScript方式工作,并且不太担心对局部变量保密。

例如

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