0

在我的主干应用程序中,我想要列出某个类的所有子类(从其扩展的子类)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 // === []

为什么这不起作用,覆盖扩展方法时是否有一些魔法?

4

1 回答 1

0

原来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 中的扩展,或者在扩展的情况下发送事件或调用回调(a la ruby​​)。

于 2012-09-10T17:20:25.897 回答