MooTools的类变量的作用域(Mootools class variable scope)

2019-09-16 21:33发布

就拿这个类:

var MyClass = new Class({
    Implements: [Events, Options],
    initialize: function() {

        this.a = 1;

    },

    myMethod: function() {

        var mc = new differentClass({
            events: {
                onClick: function() {

                    console.log(this.a); // undefined (should be 1, 2, 3 etc)

                    this.a ++;


                }
            }
        });    

    }
});

如何保持this.a价值? 我基本上是想借鉴的最后一个点到坐标刚按下一条线(使用Canvas)。

[编辑]

我不想绑定this ,因为它是坏显然,它会过度乘坐differentClass选项。

Answer 1:

几种模式可供选择。

经由装饰.bind()

var mc = new differentClass({
    events: {
        click: function() {
             console.log(this.a);
             this.a ++;
        }.bind(this) // binds the scope of the function to the upper scope (myclass)
    }
});    

保持一个参考。

var self = this; // reference parent instance of myClass
var mc = new differentClass({
    events: {
        click: function() {
             console.log(self.a); 
             self.a ++;
        }
    }
});    

指向可以对付它一个myClass的方法:

handleClick: function() {
    this.a++;
},
myMethod: function() {
    var mc = new differentClass({
        events: {
            click: this.handleClick.bind(this)
        }
    });    
}

2-ND一个-通过存储参考优选由于较小的足迹和普遍的支持而.bind不可用在每一个浏览器,需要进行匀场以及额外的时间来咖喱上执行的功能。

self是你将在MooTools的核心本身查找可能的情况下。

如果性能是没有风险,方法3大概可以提供最好的可读性和代码结构。 该参数的方法将保持单击处理程序传递的内容,即eventevent.target将处理程序。

在模式#2与selfthis将指向点击处理匿名函数内(或到另一个类,例如),这可能是有用的,以及-重新绑定上下文可以在颈部疼痛



Answer 2:

你可以参考这样的适当的范围内:

...
myMethod: function() {
    var _this = this;
    var mc = new differentClass({
        events: {
            onClick: function() {
                console.log(_this.a);
                _this.a ++;
            }
        }
    });    
}
...


文章来源: Mootools class variable scope