1

我做了很多阅读。我写了很多虚拟代码。当我开始一劳永逸地征服 JavaScript 继承时,我仍然和我一样困惑。也许更是如此。

我非常钦佩Backbone.js并且喜欢它对收藏的使用。所以我阅读了源代码并受到启发。但是我一直在继承与扩展对象之间绊倒。

这是,尽我所能推断出一个带有继承的Javascript类,出于这个使用目的,我看不到使用扩展的好处:

    function Collection(){
        this._models = [];
    }

    Collection.prototype = {

        models: function() {
            return this._models;
        },

        fetch: function() { 
            console.log("TODO Override fetch method"); 
        },

        add: function(model){
            this._models.push(model);
            $(this).triggerHandler("add", model);
        },
    }

    function Employees(){}

    Employees.prototype = new Collection();

    Employees.prototype.fetch = function(){
        this._models = [new Person("Ron", "male"), new Person("Stevie", "female"),  new Person("David Blunkett", "female")];
    }

Collection直接在其中访问 super classes( )_models属性感觉有点奇怪,Employees但它确实有效。这种方法有什么问题吗?有任何问题或注意事项吗?我不想为此构建一个应用程序来找出它有点...... naff。

编辑 它可能值得注意的Person是一个Model太......

function Model(){}

Model.prototype = {
    get: function(attr){
        return this.attr;   
    },
    set: function(attr, value){
        return this[attr] = value;
    }
}

function Person(name, gender){
    this.name = name;
    this.gender = gender;
}

Person.prototype = new Model();
4

1 回答 1

1

您创建父类的新实例并将其指定为子类的原型的方法是 Douglas Crockford 所说的 JavaScript 中的“伪经典”继承方法。观看这个深入的视频,他详细介绍了伪经典、原型和寄生继承方法以及几种变体。(伪经典大约 12 分钟)。

您的方法适用于一个(可能很大)限制,因为您不能以这种模式共享构造函数代码(至少在没有一些额外花哨的情况下不会)。所以如果你这样做:

var e = new Employees();
console.log(e.constructor);

您将看到该Collection功能,而不是更直观的Employees功能。再次,观看该视频,它确实非常清楚地涵盖了整个主题。

于 2012-11-27T15:49:21.743 回答