MooTools的隐藏功能

时间:2011-11-03 17:41:03

标签: javascript mootools

每个MooTools开发人员都应该注意MooTools的隐藏或隐藏功能是什么?

请回答一个问题。

6 个答案:

答案 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.overloadGetterFunction.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系列文章:)