如何在JS中创建全局静态方法

时间:2017-04-23 09:52:36

标签: javascript static global

我正在尝试创建一个可以从任何对象调用的全局方法。例如,我想从myObject.x调用random()

function random() {
    this = 22;
}

const myObject = {
    x: 0,
}

Object.prototype.random = random;

myObject.x.random();
console.log(myObject.x);

编辑:
Touffy的建议非常接近,这里有修改版本:

Object.defineProperty(Object.prototype, 'random', {
    value: function() {
        return 22;
    },
    enumerable: false // this is by default, you don't need to write it actually
})

const myObject = {
    x: 0,
}

console.log(myObject.x); // 0
myObject.x.random(); // Updates x to 22
console.log(myObject.x); // Should be 22

2 个答案:

答案 0 :(得分:1)

这段代码几乎是完美的。问题出在this = 22上。您无法修改this值,您需要在random上调用myObject方法而不是myObject.x

试试这个:



function random(propertyName) {
    this[propertyName] = 22;
}
    
const myObject = {
    x: 0,
}
    
Object.prototype.random = random;
    
myObject.random('myRandomNumber');
console.log(myObject.myRandomNumber);




我认为这不是那么合适的解决方案。您应该使用像ChanceJS这样的库(或者您可以编写自己的代码)。在这种情况下,您不需要将random函数添加到Object的原型中。

// Load Chance
var Chance = require('chance');

// Instantiate Chance so it can be used
var chance = new Chance();

const myObject = {
    x: 0,
}

myObject.x = chance.integer();

答案 1 :(得分:1)

撇开这样做的动机,你至少应该使你的全局方法不可枚举:

Object.defineProperty(Object.prototype, 'random', {
    value: function(property) {
        this[property] = 22
    },
    enumerable: false // this is by default, you don't need to write it actually
})

这样做的原因是为了防止在基本对象上经常使用的for… in在迭代中包含你的方法,并且混淆那些不期望"随机&#34的库;每个物体的财产。

如果您有耐心或使用最近的Babel,您可以利用bind operator

function random(property) {
    this[property] = 22
}

myObject::random('x')
// equivalent to:
random.call(myObject, 'x');

(编辑实际做某事,使用kotapeter传递属性名称的想法)