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

Javascript 如何在JS中创建全局静态方法,javascript,static,global,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.defineProper

我试图创建一个可以从任何对象调用的全局方法。例如,我想从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

这个代码几乎是完美的。问题在于
this=22
。您不能修改
值,您需要在
myObject
上调用
随机
方法,而不是在
myObject.x
上调用

试试这个:

函数随机(propertyName){
此[propertyName]=22;
}
常量myObject={
x:0,,
}
Object.prototype.random=随机;
myObject.random('myRandomNumber');

console.log(myObject.myRandomNumber)抛开这样做的动机不谈,您至少应该使您的全局方法不可枚举:

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
,将您的方法包含在迭代中,并避免混淆不希望每个对象都具有“随机”属性的库

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


(使用Kotapter传递属性名称的想法进行编辑以实际执行某些操作)

这不是有点冒险吗?尤其是当您将代码与其他第三方库一起使用时。我认为这应该避免。它不是静态的,您描述的是一个实例方法。正如shanks所说,扩展Object.prototype(即使使用
enumerable:false
)是一种不好的做法,但在我们得到绑定操作符(::)之前,它似乎是唯一的选择。而且,
this=22
也不起作用。你想做什么?我想建立一个方法,可以像
toString()
一样使用。我不打算在生产中使用此解决方案,它更像是一个测验问题。String()返回一个值,但不会更改此值。您可以很容易地编写一个返回随机数的方法,当然,除非它不依赖于
这个
,否则将其作为一个方法是没有意义的,只需使用Math.random。这不是我要找的,因为在这种情况下,您可以将random()方法仅应用于包含x object几乎:)的对象,但仍然不是我要找的对象。我希望此方法直接应用于调用该方法的对象,因此我希望能够直接从
myObject.x
调用它,而不是从
myObject
调用并将
x
作为参数传递,因此我需要两个版本来工作:
myObject.x.random()
mySecondObject.a.random()
使用Kotapter的解决方案,您可以通过执行mySecondObject.something.random('a')来实现这一点。
很抱歉将您引向了错误的方向。我想知道是否可以直接从对象调用一个方法,该对象的值将被该方法更改
random()
在这里仅用于示例。这不会更改对象的值,而是返回新值。请查看我更新的问题,您无法分配给此
。如果要更改属性的值,请使用Kotapter传递属性名称的想法。因此,无法更改调用函数的对象的值?抱歉,不。不能使用原语值
将始终在方法调用中引用同一对象。
function random(property) {
    this[property] = 22
}

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