Mootools"扩展"加上"实现"

10 mootools extends class

我喜欢写我的代码苗条和性感(在性能和内存方面),我正在使用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 */}
})
Run Code Online (Sandbox Code Playgroud)

如何判断是否每次扩展secondclass时它都不会创建Implemented类的新副本?我正在做我上面做的事情的原因是为每个需要它的类扩展SecondClass - 静态地这样做,而第二个类不能扩展超过一个类因此我使用Implements.

Dim*_*off 12

Extends和Implements之间的主要区别在于,Implement会更改类的原型,而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 :)这样的人交谈:)


更新:我甚至在博客上写过这个,但我错了.变换器喜欢ExtendsImplements引入的顺序完全不同.你可以实现和扩展但是你需要首先声明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.
Run Code Online (Sandbox Code Playgroud)

......根本行不通.你需要类人类来实现忍者而不是类badass来简单地扩展人类.除了人类获得新杀戮方法的副作用(他们可能会或可能不知道),这将意味着badass将能够使用.kill以及调用他的直接父母人.

为什么不按照你想要的方式改写事物并且没有并发症?因为您可能正在扩展像Request.JSONP这样的本机类,然后决定将新的存储类混合到扩展存储类中.真实的故事......无论哪种方式,您可能无法重构某些可用的课程.

一个有趣的模式来克服这个问题(考虑人类你的request.jsonp,在其他地方定义) - 如果你只想为你正在扩展的类添加更多方法和属性但是不打算重用mixin类(ninja):

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!
Run Code Online (Sandbox Code Playgroud)

可以说,你可以做到,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!
Run Code Online (Sandbox Code Playgroud)

希望这有助于某人.这是一个实际示例,我将Request.JSONP扩展为另一个存储类作为mixin:http://jsfiddle.net/dimitar/YacZe/


小智 1

我终于在 Mootools google group 上得到了答案,我想我会在这里更新它,以防有人对它感兴趣。

http://groups.google.com/group/mootools-users/browse_thread/thread/5aec78813fa51cc1

享受!罗马