如何向[]添加方法

How to add a method to []?

本文关键字:添加 方法      更新时间:2024-01-20

首先,我不清楚这个对象的类型是什么(也许是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()

也许做我想做的事情的唯一方法是对ember进行PR,将我的计数方法包括在Enumerable Mixin中。。。。

欢迎任何其他建议:)

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

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

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

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中的Native Array不支持深度复制?

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

你总是可以在所有枚举类型上激发"应用"方法,但这有点痛苦。。。也许有些检测黑客搜索并返回了所有主要类。。。嗯。

另一个解决方案是分叉回购并添加方法(可能会为您节省巨大的头痛和时间……您确实说过这一点)。我想在9.8中,你曾经可以做这种事情,但这些后来的构建恰恰给这带来了问题。

编辑:为了澄清,我所说的"合并"实际上是指将实际方法复制到另一个对象上。比如对(Array.prototype)……所以"检测"会找到Ember。可枚举,但Mixin不再真正被Array引用(方法在前面被复制)。

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

做了一个简单的小提琴手,但它和其他人的帖子几乎一样。我仍然不喜欢这样做,就像回购一样。