如何在 JS 中创建全局静态方法
How to create global static method in JS
我正在尝试创建一个可以从任何对象调用的全局方法。例如,我想从 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
。您无法修改 this
值,您需要在 myObject
而不是 myObject.x
.
上调用 random
方法
试试这个:
function random(propertyName) {
this[propertyName] = 22;
}
const myObject = {
x: 0,
}
Object.prototype.random = random;
myObject.random('myRandomNumber');
console.log(myObject.myRandomNumber);
我认为这不是很合适的解决方案。您应该使用像 ChanceJS 这样的库(或者您可以编写自己的代码)。在这种情况下,您不需要向对象的原型添加 random
函数。
// 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();
抛开这样做的动机不谈,你至少应该让你的全局方法不可枚举:
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
将您的方法包含在其迭代中并混淆不期望 "random" 属性 在每个对象上。
如果你有耐心或者使用最近的Babel,可以利用bind operator:
function random(property) {
this[property] = 22
}
myObject::random('x')
// equivalent to:
random.call(myObject, 'x');
(编辑实际做某事,使用 kotapeter 传递 属性 名称的想法)
我正在尝试创建一个可以从任何对象调用的全局方法。例如,我想从 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
。您无法修改 this
值,您需要在 myObject
而不是 myObject.x
.
random
方法
试试这个:
function random(propertyName) {
this[propertyName] = 22;
}
const myObject = {
x: 0,
}
Object.prototype.random = random;
myObject.random('myRandomNumber');
console.log(myObject.myRandomNumber);
我认为这不是很合适的解决方案。您应该使用像 ChanceJS 这样的库(或者您可以编写自己的代码)。在这种情况下,您不需要向对象的原型添加 random
函数。
// 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();
抛开这样做的动机不谈,你至少应该让你的全局方法不可枚举:
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
将您的方法包含在其迭代中并混淆不期望 "random" 属性 在每个对象上。
如果你有耐心或者使用最近的Babel,可以利用bind operator:
function random(property) {
this[property] = 22
}
myObject::random('x')
// equivalent to:
random.call(myObject, 'x');
(编辑实际做某事,使用 kotapeter 传递 属性 名称的想法)