首先,我不清楚这个对象的类型是什么(也许是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 ....
欢迎任何其他建议:)
答案 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
答案 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,但它与其他人发布的几乎相同。我仍然不喜欢这样的回购。