我做了很多阅读。我写了很多虚拟代码。当我开始一劳永逸地征服JavaScript继承时,我仍然感到困惑。也许更多。
我非常钦佩Backbone.js
,我喜欢它的收藏品。所以我阅读了源代码并感受到了灵感。但是,我继续绊倒继承与扩展对象。
这是最好的,我可以推断出一个带继承的Javascript类,为了这个用途,我看不到使用extend的好处:
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
访问超类(_models
)Employees
属性感觉有点奇怪,但它有效。这种方法有什么问题吗?任何gottchas或警告?我不想建立一个应用程序,以找出它... 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();
答案 0 :(得分:1)
制作父类的新实例并将其作为子类的原型进行分配的方法是Douglas Crockford在JavaScript中称之为“伪经典”继承方法的方法。查看this in-depth video详细介绍伪古典,原型和寄生遗传方法以及几种变体。 (假古典主义约12分钟)。
您的方法适用于一个(可能很大)的限制,因为您无法在此模式中共享构造函数代码(至少没有一些额外的幻想)。所以如果你这样做:
var e = new Employees();
console.log(e.constructor);
您将看到Collection
功能,而不是更直观的Employees
功能。再次,观看该视频,它确实非常清楚地涵盖了整个主题。