gpt4 book ai didi

javascript - 向对象/数字/字符串原型(prototype)添加方法

转载 作者:行者123 更新时间:2023-11-29 14:55:38 25 4
gpt4 key购买 nike

免责声明

  • 本帖旨在为遇到类似问题的其他人提供帮助,并检查是否有更好的解决方案。我将附上我自己的解决方案,但欢迎提出想法和改进(除了使其更通用)。
  • 我知道一般来说,扩展内置对象不是一个好主意。因此,此线程的假设是有充分的理由并且没有办法解决它。

场景

作为一个开发者,我想给所有的Javascript对象添加一个方法someMethod,其中ObjectNumberNumber的实现是不同的字符串

我希望解决方案满足以下验收标准:

  • A) 该解决方案在浏览器中有效
    • A1) 如果在严格上下文中使用脚本,解决方案将在严格模式下工作
    • A2) 该解决方案在非严格模式下工作,因为 'use strict'; 将在压缩期间被删除,例如 YUI Compressor [1]
  • B) 该解决方案适用于 node.js
    • B1) 解决方案在严格模式下工作(原因见 A1)
    • B2) 由于与 B2 相同的原因,该解决方案在非严格模式下工作,而且无法在函数级别激活 node.js 中的严格模式[2]
  • C) 我希望允许其他对象覆盖此方法
  • D) 如果可能,我想控制该方法是否出现在 for .. in 循环中以避免与其他库发生冲突
  • E) 解决方案应实际修改原型(prototype)。

[1] Minfication removes strict directives
[2] Any way to force strict mode in node?

最佳答案

我自己的解决方案

在尝试解决这个问题时,我遇到了一些导致一个或另一个验收标准失效的问题(例如 [1] 中描述的问题)。一段时间后,我想出了以下似乎对我有用的解决方案。当然,这可以用更通用的方式编写。

(function () {
'use strict';

var methodName = 'someMethod',
/** Sample method implementations */
__someMethod = {
'object': function () {
var _this = this.valueOf();

return ['Object'].concat( Array.prototype.slice.call( arguments ) );
},

'number': function () {
var _this = this.valueOf();

return ['Number'].concat( Array.prototype.slice.call( arguments ) );
},

'string': function () {
var _this = this.valueOf();

return ['String'].concat( Array.prototype.slice.call( arguments ) );
},

'boolean': function () {
var _this = this.valueOf();

return ['Boolean', _this];
}
};

if( Object.defineProperty ) {
Object.defineProperty( Number.prototype, methodName, {
value: __someMethod['number'],
writable: true
} );

Object.defineProperty( String.prototype, methodName, {
value: __someMethod['string'],
writable: true
} );

Object.defineProperty( Boolean.prototype, methodName, {
value: __someMethod['boolean'],
writable: true
} );

Object.defineProperty( Object.prototype, methodName, {
value: __someMethod['object'],
writable: true
} );
} else {
Number.prototype[methodName] = __someMethod['number'];
String.prototype[methodName] = __someMethod['string'];
Boolean.prototype[methodName] = __someMethod['boolean'];
Object.prototype[methodName] = __someMethod['object'];
}
})();

编辑: 我更新了解决方案以添加针对 [1] 中提到的问题的解决方案。即它是行(例如)var _this = this.valueOf();。如果使用

'number': function (other) {
return this === other;
}

在这种情况下,你会得到

var someNumber = 42;
console.log( someNumber.someMethod( 42 ) ); // false

这当然不是我们想要的(同样,原因在 [1] 中说明)。所以你应该使用 _this 而不是 this:

'number': function (other) {
var _this = this.valueOf();
return _this === other;
}

// ...

var someNumber = 42;
console.log( someNumber.someMethod( 42 ) ); // true

[1] Why does `typeof this` return "object"?

关于javascript - 向对象/数字/字符串原型(prototype)添加方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18390236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com