這裏是我的解決方案:
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
這適用於單層骨幹風格的繼承,其中骨幹extend
功能作爲以上。
的作品,因爲,因爲骨幹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
。
我唯一的評論是:爲什麼?你爲什麼需要這個? – 2013-03-16 17:06:19
@alexanderb:我想要這個測試。具體來說,在我的情況下,我有'繼承''綁定到'PR.test.utils.inherits',和: '好吧(PR.test.utils.inherits(PR.Router,Backbone.Router)''at PR.Router Backbone-extends Backbone.Router。');' – 2013-03-16 17:25:30
它是愚蠢/太多? – 2013-03-16 17:30:03