Javascript 原型(prototype)类继承

标签 javascript jquery class prototype underscore.js

我读了很多书。我写了很多伪代码。当我着手一劳永逸地征服 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")];
    }

直接在 Employees 中访问父类(super class)(Collection)_models 属性感觉有点奇怪,但它确实有效。这种做法有什么问题吗?有什么问题或警告吗?我不想以此为基础构建一个应用程序来发现它有点......废话。

编辑 值得注意的是,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();

最佳答案

创建父类的新实例并将其指定为子类的原型(prototype)的方法就是 Douglas Crockford 所说的 JavaScript 中的“伪经典”继承方法。查看this in-depth video他在其中详细介绍了伪经典、原型(prototype)和寄生继承方法以及几种变体。 (伪古典大约 12 分钟)。

您的方法可以很好地解决一个(可能很大)限制,即您无法在此模式中共享构造函数代码(至少不是没有一些额外的花哨)。所以如果你这样做:

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

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

关于Javascript 原型(prototype)类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13587348/

相关文章:

javascript - 调用 ko.applyBindings 后向 Knockout View 模型添加新属性

javascript - 是否可以在 jQuery 中进行半异步 ajax 调用?

c++ - 这是测试两条线是否共线的正确方法吗?

javascript - 未在 Promise 的 .then() 部分内设置变量

javascript - Angular :如何在单元测试中模拟扩展类

javascript - 检测 Javascript 何时表现不佳

Java Swing 应用程序不再工作

sqlite - Android 中存在数据库问题的应用程序类

javascript - 从JavaScript错误事件处理程序获取更多详细信息

javascript - 如何将相同的 jQuery 代码应用于同一类的两个实例?