如何测试构造函数是否扩展了另一个构造函数Backbone.js-style,其中继承是通过Backbone的extend
方法设置的?并且不要说instanceof
:)。我不是在谈论对象。我在谈论建设者。
例如:采用类似下面代码生成的构造函数:
var MyRouter = Backbone.Router.extend();
现在,在代码中的另一个位置,如何测试其原型链中的某个位置,var my_router = new MyRouter
具有Backbone.Router.prototype
的属性?
答案 0 :(得分:0)
这是我的解决方案:
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的extend
功能如上所述。
可行,因为Backbone的extend
在设置原型链时执行以下操作,其中child
是最后得到的构造函数,而parent
是构造函数。延伸:
var Surrogate = function(){ this.constructor = child; };
Surrogate.prototype = parent.prototype;
child.prototype = new Surrogate;
因此,由extend
生成的构造函数在其.prototype.__proto__
属性上具有其所有父级的原型属性。如果这是新的或令人困惑的,您可以在John Resig's blog上阅读更多相关信息。基本上,"test".__proto__ === String.prototype
。