我喜欢写我的代码苗条和性感(在性能和内存方面),我正在使用Mootools并且想知道我是否以正确的方式使用它,你也可以通过告诉我如何测试我的代码来帮助我找到答案我正在寻找自己。
//First we create a class like so:
var FirstClass = new Class {(
'someFunc': function() { /* do stuff */ }
})
//Now this class uses first class with "Implements"
var SecondClass = new Class ({
'Implements': [FirstClass, SomeOtherClass, SomeOtherOtherClass],
'iAlsoDoStuff': function() {/*do stuff */}
})
// finally the class that Extends second class
var ThirdClass = new Class ({
'Extends': SecondClass,
'takeOverTheWorld': function() {/*code to win lottery */}
})
如何判断每次更新secondclass时,它是否都不会生成Implemented类的新副本? 我正在做我上面做的事情的原因是为每个需要它的类扩展SecondClass - 这样做是静态的,而第二个类不能扩展到一个类,因此我使用Implements。
答案 0 :(得分:12)
Extends和Implements之间的主要区别在于,实现更改了类的原型,而Extend创建了一个副本。这意味着如果您对类实现更改,该类的所有实例将立即继承该更改,而如果您使用Extend,则所有现有实例将保持不变。
这是mootorial的引用,检查出来。 http://mootorial.com/wiki/mootorial/02-class/#implement-vs.-extend
至于测试 - 我非常建议你用忍者类构建一些示例案例并将它们放到http://www.jsfiddle.net - 然后在谷歌或IRC上询问一些分析建议或mootools邮件列表(irc) .freenode.net#mootools),SO似乎没有从mootools核心团队获得很多点击。理想情况下,你想和像aaron newton,arian,cpojer或rpflo这样的人交谈:)
Extends
和Implements
等变换器的顺序差别很大。您可以实现和扩展但是您需要首先声明Extends才能工作。在此处阅读更多内容:http://fragged.org/mootools-pattern-fun-class-implements-extends-at-the-same-time_1359.html
更新原来,在某些情况下这很有用。这是问题所在:
var ninja = new Class({
kill: function() {
alert("kill!");
}
});
var human = new Class({
initialize: function(){
alert("i r human!");
}
});
var badass = new Class({
Implements: [ninja],
Extends: human,
initialize: function() {
alert("i r badass and.. ");
this.parent();
this.kill();
}
});
new badass(); // i r badass, i r human, this.kill is not a function exception.
......根本行不通。您需要使用人类类来实现 ninja ,并使用 badass 类来简单地扩展人类。除了人类获得新杀戮方法的副作用(他们可能知道或可能不知道),这将意味着badass将能够使用.kill以及呼唤他的直接父母。
为什么不按照你想要的方式改写事物并且没有并发症?因为您可能正在扩展像Request.JSONP这样的本机类,然后决定将新的存储类混合到扩展存储类中。真实的故事......无论哪种方式,您可能无法重构某些可用的课程。
一个有趣的模式来克服这个问题(考虑人类你的request.jsonp,在其他地方定义) - 如果你只想为你正在扩展的类添加更多方法和属性但是不打算重用mixin类(忍者):
human.implement(new new Class({
kill: function() {
alert("kill!");
}
}));
var badass = new Class({
Extends: human,
initialize: function() {
alert("i r badass and.. ");
this.parent();
this.kill();
}
});
new badass(); // // i r badass, i r human, kill!
可以说,你可以做human.implement({ method: function });
,但是课程可以更多。
如果您希望保存对忍者类的参考用于其他用途,上述内容将与此相同(如果您打算重复使用mixin):
var ninja new Class({
kill: function() {
alert("kill!");
}
});
human.implement(new ninja);
// this is what differs from say - instantiation + shared inherited properties.
// also, a constructor will work.
// the alternative would just do:
// human.prototype.kill = function() { alert("kill"); }
var badass = new Class({
Extends: human,
initialize: function() {
alert("i r badass and.. ");
this.parent();
this.kill();
}
});
new badass(); // // i r badass, i r human, kill!
希望这有助于某人。这是一个实际示例,我将Request.JSONP与另一个存储类扩展为mixin:http://jsfiddle.net/dimitar/YacZe/
答案 1 :(得分:1)
我终于得到了关于Mootools google小组的答案,我想我会在这里更新它,以防有人对此感兴趣。
http://groups.google.com/group/mootools-users/browse_thread/thread/5aec78813fa51cc1
享受! 罗马
答案 2 :(得分:0)
扩展和实现由Mootools开发人员自己进行了很好的测试。事实上,他们使用的整个测试套件可在anutron/mootools-unittester上获得。您不需要测试框架的核心功能,它是为您完成的(并且也做得非常好)。
我建议您仔细阅读有关mootools docs,clientcide网站,mootorial等的Extend和Implement的内容。
顺便说一下,你创造了多少个物体?如果它不是一个庞大的数字那么内存等应该不是一个主要问题,即使它是以一种内存繁重的方式创建对象。这可能是不成熟的优化吗?