4

首先,我并不清楚这个对象的类型(也许是 NativeArray ?)。对我来说,ember 通过将 NativeArray mixin 应用到 Array.prototype 来使用一些 mixin 覆盖默认的 javascript 数组。

也就是说,在我的代码中,我想通过允许进行这种覆盖:

["a", "b", "a"].count("a") // returns 2

我试图重新打开 Enumerable Mixin (对我来说这是这种功能的正确位置)

我确定在使用 count() 方法之前执行了重新打开代码。但是我遇到了这个错误:

Object has no method count().

阅读代码似乎我必须将 mixin 重新应用于 Array.prototype,但不幸的是,什么都不做Ember.Enumerable.apply(Array.prototype)

更新: 看了一些文章后,我开始了解原型。我可以将函数添加到数组中:

Array.prototype.newFunc = function () {
    console.log('bla');
}

但就我而言,这并不令人满意,例如,一个 MutableArray 将能够调用newFun()

也许做我想做的唯一方法是制作一个 PR 以将我的计数方法包含到 Enumerable Mixin 中。

欢迎任何其他建议:)

4

3 回答 3

4

您正在寻找reopen,它允许您修改现有的类。这是一个例子:

Ember.Enumerable.reopen({
    newFunc: function() {
        console.log('blah');
    }
});

警告:调用reopen不会对已经实例化的对象产生影响。它只会影响调用重新打开后创建的对象。简而言之,确保你reopen先打电话。

于 2012-07-24T17:16:08.763 回答
3

http://jsfiddle.net/kcjzw/249/

App = Ember.Application.create();

var NativeArray = Ember.Mixin.create(Ember.NativeArray, {
    count: function(ele) {
        var noOfEle = 20;
        //add your logic to count
        return noOfEle;
    }
});

NativeArray.apply(Array.prototype);
console.log(["a", "b", "a"].count("a")); //20

REF: Emberjs 中的原生数组不支持深拷贝?

于 2012-07-24T15:32:27.180 回答
2

这不是 100% 的,所以请带着一点怀疑来阅读它。看起来 mixins 在更新和创建时可以遵循两条主要路径。一个是“重新打开”方法,这最终会向对象添加另一个 mixin。第二个是“应用”,它实际上将这些 mixin 合并到对象本身中,并且您丢失了 mixin 引用。因此,除非您在定义的新类中使用它,否则更新 Ember.Enumerable 几乎不会给您带来任何好处。

您总是可以在所有 Enumerable 类型上触发“应用”方法,但这有点痛苦......也许有些检测到搜索并返回所有主要类的黑客......嗯。

另一个解决方案是分叉 repo 并添加方法(可能会为您节省大量的头痛和时间……您确实对此说过一些话)。我想在 9.8 中你曾经能够做这种事情,但是这些后来的构建对此提出了一个问题。

编辑:为了澄清,“合并”我的意思是把实际的方法复制到另一个对象上。例如 (Array.prototype)... 所以“检测”会找到 Ember.Enumerable 但该 Mixin 不再真正被 Array 引用(方法已复制到前面)。

我想你可以创建一个新的 mixin 并根据需要将其应用于类型(你只需要记住你是明确地这样做的)。现在,如果您只需要在 Array 上使用它,您只需将其应用到 Array.prototype。下次当你需要它时,比如说 ArrayController,你添加它。

做了一个简单的提琴手,但它与其他人发布的几乎相同。我仍然不喜欢分叉回购。

于 2012-08-05T04:42:12.060 回答