Javascript 如果在使用方法后将其删除,则将方法附加到字符串是否安全?
我刚刚进入Node.js和CommonJS模块,我正在尝试扩展String对象,而不影响我应用程序的其余部分,并提供一个干净的方法 我想知道,是否可以将一个方法附加到全局字符串对象,然后在文件底部,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
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")