gpt4 book ai didi

javascript - 仅在当前范围内扩展基元

转载 作者:行者123 更新时间:2023-11-29 10:12:28 26 4
gpt4 key购买 nike

是否可以复制像 String 这样的原语,以便它只能在当前函数中扩展?

var foo = function() {
var String = // somehow clone String (the primitive function)
String.prototype.first = function() { return this.charAt(0) };
return 'abc'.first();
}
foo(); // returns 'a'
'abc'.first(); // returns TypeError "abc".first is not a function

解决方案要么复制看似不可能的原语,要么在功能完成后销毁新方法......

最佳答案

String 是全局的,如果您更改它或添加到其原型(prototype),则根据定义更改是全局的。因此,要还原更改,您必须还原它们。

通常,人们会尝试派生一个自定义子类并向其添加新的原型(prototype)方法,但是众所周知,像 String 这样的内置类型很难进行子类化,即使可以,您也必须使用类似 MyString('abc').first().

您的问题源于您对扩充 String 原型(prototype)的错误观念。 污染原型(prototype)从来都不是一个好主意。我理解你的想法,即在添加和使用它之后以某种方式快速删除它,但这不现实,setTimeout 方法是一种可怕的、不可靠的 hack。

但是,如果您真的坚持要添加到 String 原型(prototype),那么一个想法是将所有新实例方法添加到一个不太可能与事物发生冲突的属性中。我们称它为 Utils。我们希望能够调用

'abc'.Utils.first()

但是我们怎样才能让它发挥作用呢?我们在 Utils 属性上定义了一个 getter,它返回方法的散列。使用 getter(而不是 value)为我们提供了 this,我们可以使用 bind 将其传递给方法。

Object.defineProperty(String.prototype, 'Utils', { 
get: function() {
return {
first: function() { return this.charAt(0); }.bind(this)
};
}
});

> 'abc'.Utils.first()
< "a"

关于javascript - 仅在当前范围内扩展基元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30658421/

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