Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.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_Prototype - Fatal编程技术网

Javascript 如果在使用方法后将其删除,则将方法附加到字符串是否安全?

Javascript 如果在使用方法后将其删除,则将方法附加到字符串是否安全?,javascript,prototype,Javascript,Prototype,我刚刚进入Node.js和CommonJS模块,我正在尝试扩展String对象,而不影响我应用程序的其余部分,并提供一个干净的方法 我想知道,是否可以将一个方法附加到全局字符串对象,然后在文件底部,deleteit 例如: // hasCondition.js String.prototype.has = function(regex) { return regex.test(this); }; exports.removeMethod = function () { dele

我刚刚进入Node.js和CommonJS模块,我正在尝试扩展String对象,而不影响我应用程序的其余部分,并提供一个干净的方法

我想知道,是否可以将一个方法附加到全局字符串对象,然后在文件底部,
delete
it

例如:

// hasCondition.js

String.prototype.has = function(regex) {
    return regex.test(this);
};
exports.removeMethod = function () {
    delete String.prototype.has;
};


如果不想让字符串空间变得杂乱无章,可以创建一个新的对象,该对象由字符串原型化。然后,将
在其原型中具有的
方法指定给该对象。它不会传播回字符串

这样,您就可以封装它。当然,您添加了另一个间接层,但它已经是一个

如果你不担心
以后会被保存在某个地方,那么可能不会。
即使您使用添加的
has
方法从字符串生成子对象,当它被删除时,它也会从任何继承中删除

例如(假设定义了assert):

考虑这种情况: 你创建了这个模块,它非常有用,所以你把它放在NPM上,很多人都使用它。其中一些用户还认为扩展string对象对他们很有用,他们还将其中一个方法称为“has”

当他们使用你的模块时,它会覆盖你的“has”方法。不用担心,因为您将在自己之后清理并删除您添加的方法。你知道接下来会发生什么。。。他们试图使用他们的方法,但突然之间它没有定义

如果你给它起了一个非常模糊的名字,你很可能会遇到这种情况,但这仍然不是最好的方法。通常,最好尽量将代码封装在模块中,避免泄漏


在这种情况下,您可能希望创建自己的字符串构造函数,可以使用自定义方法将其扩展到您的核心内容,而不必担心将增强功能泄漏到模块之外。

将原型函数附加到内置对象(而不是
对象本身)通常是可以的。唯一会中断的代码是写得不好的代码。再见,谢谢!!你的信息是完美的。我需要开始阅读JavaScript模式手册=)我想我担心其他人的插件/模块会被加载,其中一个.has方法会被破坏。好吧,如果已经有一个
has
方法,你会覆盖它。我可能已经提到了。无论如何,jbabey在评论中的链接解释得很好。另请参见Bummer,在这种情况下,我似乎无法使用新字符串()。字符串来自节点的
fs.readFileSync(filePath,'utf-8')
方法,该方法读取文件并返回字符串。既然它只是一个命令行程序,我想发生冲突的可能性很小。为什么不能像
str=newmystringdecorator(fs.readFileSync(filePath,'utf-8'))这样做呢?
// someFile.js

var has = require('./hasCondition');
console.log(  "foo bar baz".has(/baz/)  );
has.removeMethod();
console.log(  "foo bar baz".has(/baz/)  );

>>> true
>>> Object foo bar baz has no method 'has'
function Str1() {}
Str1.prototype = new String()
String.prototype.has = function(t) { /* code here */ }
var x = new Str1()
assert(x.has)

function Str2() {}
Str2.prototype = new Str1()

var y = new Str2()
assert(y.has)

delete String.prototype.has

assert(typeof x.has === "undefined")
assert(typeof y.has === "undefined")