引用类函数在同一个类中

时间:2014-07-24 17:18:24

标签: javascript jquery class

Math对象的这个扩展很有效:

var MathClassExtensions = {
    randomNumber: function(minimum, maximum){
        return Math.round( Math.random() * (maximum - minimum) + minimum );
    } 
};
$.extend(Math, MathClassExtensions);

Math.randomNumber(4,9) //=> 4,5,5,3,1,8,9

但是,我只关心Math.round( Math.random() * (maximum - minimum) + minimum );我们似乎是在Math对象中调用Math对象......

这真的很重要吗?我仍然认为如果我可以做这样的事情会感觉更好:

self.round( self.random() * (maximum - minimum) + minimum );

但是,以上是伪代码,不起作用。我怎样才能让它发挥作用?

更新

或者,当它是MathClassExtensions对象的一部分时,是否会对randomNumber属性进行求值,因此使用self或等效函数将完全没有意义?

2 个答案:

答案 0 :(得分:0)

据我记忆,Javascript使用的是此而非自我。无论如何,由于这些方法是静态的,我认为这段代码没有问题

答案 1 :(得分:0)

虽然您可以使用this

执行此操作
var MathClassExtensions = {
    randomNumber: function(minimum, maximum){
        return this.round( this.random() * (maximum - minimum) + minimum );
    }
};

我会建议不要这样做。问题是您现在已经将可重用函数绑定到单个执行上下文。使用单个参数的功能来演示问题更容易,尽管它仍然存在于您的版本中:

var MathClassExtensions = {
    rand1: function(maximum){
        return Math.round(Math.random() * maximum);
    },
    rand2: function(maximum){
        return this.round(this.random() * maximum);
    }
};

$.extend(Math, MathClassExtensions);

Math.rand1(100); //=> 64 (for example)
Math.rand2(1000); //=> 357 (for example)

到目前为止,这么好。但是,如果我们使用Math.rand1 / Math.rand2作为普通函数而不是Math的静态方法呢?

[10, 50, 200].map(Math.rand1); //=> [10, 44, 157] (for example)
[10, 50, 200].map(Math.rand2); //=> TypeError: undefined is not a function 

麻烦的是,以这种方式运行函数Math.rand2只是一个函数,不依赖于Math对象。当它被调用时,this是当前上下文(可能是全局[窗口?]上下文),并且没有roundrandom函数。但由于Math.rand1没有使用this,因此效果很好。