每个MooTools开发人员都应该注意MooTools的隐藏或隐藏功能是什么?
请回答一个问题。
答案 0 :(得分:9)
类突变者
MooTools有一个很棒的功能,可以让你创建自己的Class mutators。例如,要为引用的特定类方法添加记录器,您可以执行以下操作:
// define the mutator as 'Monitor', use as Mointor: ['methodname', 'method2'...]
Class.Mutators.Monitor = function(methods){
if (!this.prototype.initialize) this.implement('initialize', function(){});
return Array.from(methods).concat(this.prototype.Monitor || []);
};
Class.Mutators.initialize = function(initialize){
return function(){
Array.from(this.Monitor).each(function(name){
var original = this[name];
if (original) this[name] = function() {
console.log("[LOG] " + name, "[SCOPE]:", this, "[ARGS]", arguments);
original.apply(this, arguments);
}
}, this);
return initialize.apply(this, arguments);
};
};
然后在课堂上:
var foo = new Class({
Monitor: 'bar',
initialize: function() {
this.bar("mootools");
},
bar: function(what) {
alert(what);
}
});
var f = new foo();
f.bar.call({hi:"there from a custom scope"}, "scope 2");
尝试使用jsfiddle:http://jsfiddle.net/BMsZ7/2/
这个小宝石一直帮助我在HUUUGE async webapp中捕获嵌套的bugfoot竞争条件问题,否则这些问题很难被追踪。
答案 1 :(得分:6)
Function.prototype.protect
可能是一个鲜为人知的好人。
用于在类中使用受保护的方法:
var Foo = new Class({
fooify: function(){
console.log('can\'t touch me');
}.protect(),
barify: function(){
this.fooify();
}
});
var foo = new Foo();
foo.fooify(); // throws error
foo.barify(); // logs "can't touch me"
就我个人而言,我并不经常使用它,但在某些情况下它可能会有用。
答案 2 :(得分:5)
Function.prototype.overloadGetter
和Function.prototype.overloadSetter
请参阅此帖子:What does MooTools' Function.prototype.overloadSetter() do?
答案 3 :(得分:4)
如果您阅读源代码,可以使用许多功能,尽管官方行是:if it's not in the documentation, it is not in the api and it's not supported so do not base your code around it as it may change
话虽如此,但有一些事情确实非常有用。我最喜欢的无证功能之一是:
引用的元素有一个uid
任何已创建或通过选择器传递的元素都会被赋予属性uid
,该属性是增量且唯一的。从MooTools 1.4.2开始,这只能通过Slick.uidOf(node)
读取,而不能通过旧元素attr .uid
读取。您现在可以使用任何MooTools Element对象的新uniqueNumber
属性。
如何使用?对于初学者,元素存储。它依赖于uid作为闭包内Storage
对象中的键,该对象具有该元素的.store
'。
element.store('foo', 'bar');
转换为:
Storage[Slick.uidOf(element)].foo = 'bar';
和
element.retrieve('foo'); // getter of the storage key
element.eliminate('foo'); // delete Storage[Slick.uidOf(element)].foo
初始化您在外部创建的元素的存储空间,例如,通过var foo = document.createElement('div')
而非元素构造函数
Slick.uidOf(foo); // makes it compatible with Storage
// same as:
document.id(foo);
框架存储到存储中的内容还包括所有events
个回调,validators
个实例,Fx
个实例(补间,变换等)等等。
你知道元素的UID能做什么?好吧,克隆元素不会获得元素的存储或事件。实际上,您可以编写一个新的Element.cloneWithStorage
原型,它也将复制您可能拥有的所有存储值,这对于某个点非常有用 - 引用特定元素的实例(例如,Fx.Tween
)将继续引用旧元素,因此可能会产生意外结果。这对于移动您自己的存储非常有用,但是,您只需要一种类似的方法来记录您存储的内容并允许您克隆它。
另一个元素数据的存储穿孔示例:
var foo = new Element('div'),
uid = foo.uniqueNumber;
foo.store('foo', 'foo only');
var bar = new Element('div');
console.log(bar.retrieve('foo')); // null
bar.uniqueNumber = uid; // force overwrite of uid to the other el
console.log(bar.retrieve('foo')); // foo only - OH NOES
console.log(Object.keys(foo)); // ["uniqueNumber"] - oh dear. enumerable!
答案 4 :(得分:3)
我最近学到的一个我最喜欢的功能,但希望我从一开始就知道 - 事件伪,特别是:once
。
请参阅http://mootools.net/docs/more/Class/Events.Pseudos#Pseudos:once
答案 5 :(得分:2)
我建议您在Up the Moo Herd的作者Mark Obcena阅读优秀的Pro Javascript With MooTools系列文章:)