如何在[]中添加方法?

时间:2012-07-24 14:00:19

标签: javascript ember.js

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

有人说,在我的代码中,我希望通过允许来实现这种覆盖:

["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 ....

欢迎任何其他建议:)

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分: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

参考:Native Array in Emberjs does not support deep copy?

答案 2 :(得分:2)

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

你总是可以在所有Enumerable类型上触发“apply”方法但是有点痛苦...也许有些检测到hack搜索并返回所有主类...... meh。

另一种解决方案是分叉回购并添加方法(可能会为您节省大量时间和时间....你确实对此有所说明)。我想回到9.8你曾经能够做到这一点,但这些后来的版本确实存在问题。

编辑:为了澄清,通过“合并”,我的意思是将实际方法复制到另一个对象上。比如(Array.prototype)......所以'detect'会找到Ember.Enumerable但是Mixin不再是Array的引用(方法是先前复制的)。

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

制作了一个simple fiddler,但它与其他人发布的几乎相同。我仍然不喜欢这样的回购。