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