这是我的解决方案:
var inherits = function(child, parent) {
if (!_.isFunction(child) || !_.isFunction(parent))
throw new Error('`child` and `parent` must be functions.');
return _.reduce(Object.getPrototypeOf(child.prototype), function(memo, child_prototype__proto__) {
return _.contains(parent.prototype, child_prototype__proto__) && memo;
}, true);
}
所以,你可以这样做:
var MyRouter = Backbone.Router.extend();
inherits(MyRouter, Backbone.Router) // true
inherits(MyRouter, Backbone.Model) // false
这适用于单层 Backbone 风格的继承,其中 Backbone 的extend
功能如上使用。
之所以有效,是因为 Backboneextend
在设置原型链时会执行以下操作,child
最后你得到的构造函数在哪里parent
,你正在扩展的构造函数在哪里:
var Surrogate = function(){ this.constructor = child; };
Surrogate.prototype = parent.prototype;
child.prototype = new Surrogate;
因此,生成的构造函数extend
在其属性上具有其父级的所有原型属性.prototype.__proto__
。如果这是新的或令人困惑的,您可以在John Resig 的博客上阅读更多相关信息。本质上,"test".__proto__ === String.prototype
.