如何覆盖主干中的extend方法
How does one override the extend method in backbone
在我的主干应用程序中,我想要一个特定类A
的所有子类(从中扩展的子类)的列表。为了实现这一点,我想覆盖默认的extend
方法,但是我的(也许是天真的)方法不起作用:
var A = Backbone.Model.extend({
/* ... */
}, {
__children: [],
extend: function () {
var Klass = this;
result = Klass.__super__.extend.apply(Klass, arguments);
Klass.__children.push(result);
return result;
}
});
B = A.extend({}, {className: "B"});
A.__children // === []
为什么这不起作用,在重写extend方法时是否有一些魔力?
原来extend方法是特殊的。正如你从中看到的那样
> Backbone.Model.extend
function (protoProps, classProps) {
var child = inherits(this, protoProps, classProps);
child.extend = this.extend;
return child;
}
extend
方法会被父类中的一个覆盖,无论你试图如何处理它。因此,解决这个问题的方法是在之后"修复"扩展方法:
var enableChildTracking = function (Klass) {
var old_extend = Klass.extend;
Klass.__children = [];
Klass.extend = function () {
var That = this;
var result = old_extend.apply(That, arguments);
That.__children.push(result);
result.__children = [];
return result;
};
};
var A = Backbone.Model.extend({});
enableChildTracking(A);
B = A.extend({}, {className: "B"});
C = A.extend({}, {className: "C"});
A.__children.map(function (child) {return child.className}); /* == ["B", "C"] */
当然,这种方式也可以直接覆盖Backbone.Model中的扩展,或者在进行扩展时发送事件或调用回调(la ruby)。
相关文章:
- electronic BrowserWindow的最小高度和宽度在hide()show()方法之后不起作用
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 数组在递归方法中设置为null
- 打破承诺链的好方法是什么
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- 使用“;这个“;JavaScript原型方法中的关键字
- 序列化数据属性中对象的最可靠方法
- 使用Objective-C的JavaScript注入方法
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 有没有一种方法可以防止img get请求使用css或js发生
- Javascript,有没有一种方法可以将数组写成没有逗号或空格的单个文本字符串
- 如何覆盖主干中的extend方法
- 可以't通过$extend向$firebaseObject添加多个方法
- 使用lodash'扩展JS对象实例;s的extend方法会导致奇怪的结果
- 如何使用 _.extend 或 $.extend 扩展 javascript 对象以包含方法
- 为什么 Backbone 自始至终都使用 _.extend() 方法
- javascript原型方法分配VS下划线_.extend
- 未捕获的类型错误:不能调用方法'extend'的定义
- 继承_.extend的Javascript设计方法
- 调用jQuery Extend中的另一个方法