Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
修改JavaScript基元类型的最佳实践_Javascript - Fatal编程技术网

修改JavaScript基元类型的最佳实践

修改JavaScript基元类型的最佳实践,javascript,Javascript,我试图找到一种方法,在不修改本机string对象的情况下,对string原语调用自定义方法 String.prototype.addOne = function() { return this.length + 1}; let str = new String('abc') str.addOne() // 4 上述代码的问题在于,新字符串也将具有新方法,并且上述方法创建可能会覆盖在库或代码库的其他区域内进行的其他基本修改,例如: String.prototype.addTwo = funct

我试图找到一种方法,在不修改本机
string
对象的情况下,对string原语调用自定义方法

String.prototype.addOne = function() { return this.length + 1};

let str = new String('abc')
str.addOne() // 4
上述代码的问题在于,新字符串也将具有新方法,并且上述方法创建可能会覆盖在库或代码库的其他区域内进行的其他基本修改,例如:

String.prototype.addTwo = function() {return  this.addOne + 1}
str.addTwo() // 5

String.prototype.addOne = function() { return this.length + 10};
str.addOne() // 13
str.addTwo() // 14, oops
是否有任何解决方案允许我创建
String
对象的克隆,这样我就可以安全地修改其原型,而不必修改本地全局
String
对象

编辑:

我特别想问的是,是否有一种方法可以让我将方法添加到基本字符串中一些人建议扩展String类,添加一个方法,然后返回一个
字符串
对象。但是,这与基本字符串对象不同。我基本上希望能够像这样调用自定义方法:

class CustomString extends String{
  someMethod(){
    return 'someValue'
  }
}

let str = '123'
str.someMethod() // '123'                                             <<< this

let str2 = new CustomString('123')
str2.someMethod() // CustomString { [Iterator] 0: '4', 1:'5'. 2: '6'} <<< not this

听起来您可能想创建一个扩展字符串的类:

(()=>{
//在一个模块中:
类SpecialString扩展字符串{
addOne(){
返回此值。长度+1
}
}
const str=新的特殊字符串(“abc”);
console.log(str.addOne())//4
})();
(() => {
//在另一模块中:
类SpecialString2扩展字符串{
addTwo(){
返回此.addOne()+1
}
addOne(){
返回此值。长度+10
}
}
const str=new SpecialString2(“abc”);
log(str.addTwo());
log(str.addOne());
log(str.addTwo());

})();只需创建一个子类:

类CustomString扩展字符串{
addOne(){…}
}
然后简单地说:

newcustomstring(“asd”).addOne()
此类与
String
非常相似,但您可以创建附加属性,而不会与基本字符串和本机
String
类冲突。
即使是
instanceof
也可以使用它:

new CustomString()instanceof String//true
但请注意,您将无法使用此构造函数创建基元字符串:

字符串(1)/“1”
CustomString(1)//错误

编辑:根据问题的编辑:

经过一番周折,我找到了在不影响基本体的构造函数的情况下将属性修补到基本体原型的方法:

函数自定义字符串(从){
让线
if(new.target){//是否作为构造函数调用
字符串=新字符串(从)
}否则{
字符串=字符串(从)
}
assign(Object.getPrototypeOf(string)、CustomString.prototype)
返回字符串
}
//添加自定义属性,如下所示:
CustomString.prototype.addOne=function(){返回this.length+1}
//如果没有“新建”,则创建基本字符串
常量原语CustomString=CustomString('asd')
//使用“新建”,创建字符串对象
const objectCustomString=new CustomString('asd')
console.log(primitiveCustomString)/“asd”
console.log(objectCustomString)//字符串{0:a',1:s',2:d',addOne(){…}
console.log(primitiveCustomString.addOne())//4
console.log(objectCustomString.addOne())//4
//您甚至可以将其与普通字符串连接在一起,自定义属性仍然保留
console.log(((“asd”+原语CustomString+“asd”).addOne())//10

console.log(((“asd”+objectCustomString+“asd”).addOne())//10
您可以编写工厂函数

function addoneable_string(s) {
  let ns = new String(s);
  ns.addOne = function() { return this.length + 1};
  return ns;
}

let s = addoneable_string("1");
console.log( s.addOne() );

不起作用:TypeError:(中间值)。addOne不是函数我将“1”更改为新字符串(“1”)
,它运行正常,但仍然无法解决问题,请检查对原始问题的编辑:)是的,它只适用于字符串对象,我更新了答案。另外,恐怕这一次你必须决定是保留蛋糕还是吃蛋糕。您不能期望基元字符串支持完整对象的功能。您可以对原语调用方法的唯一原因是,JS会将原语默默地包装到字符串对象中。为什么要避免使用字符串对象?您是否担心开销或其他问题?我正在尝试创建一个返回字符串的API包装器,但如果在该字符串上调用另一个方法,它将像方法一样对其进行操作。但是如果没有提供方法,它将只返回字符串。e、 g,
search('123')
应该是一个返回查询字符串
search?q=123
的方法,但我希望能够添加一个可选方法,如
search(123)。其中({x:5})
返回类似
search?q=123&x=5
的内容。我可以返回一个string对象,该对象在每次调用结束时调用
exec()
函数,将string对象转换为string原语,但它不太漂亮:(我已经更新了问题,以解释我在这方面遗漏的一些细节answer@JamesWilkinson我担心如果不修改本机的
String
class'原型,这是不可能的……难道没有办法克隆
String
对象并修改新的
String
对象而不影响全局
Str吗ing
object?@JamesWilkinson可以创建一个具有自定义属性和配置的新类,但不能创建新的基元类型,基元字符串将始终具有本机
String
.Gah的原型,这太糟糕了。难道没有办法至少将原型方法的访问范围限定为仅在c中吗特定的阻塞或关闭?您是否也可以向我指出任何资源以了解有关此问题的更多信息?谢谢。我已根据您的答案修改了问题,请检查编辑:)
function addoneable_string(s) {
  let ns = new String(s);
  ns.addOne = function() { return this.length + 1};
  return ns;
}

let s = addoneable_string("1");
console.log( s.addOne() );