如果在使用后删除它,将方法附加到String是否安全?

时间:2013-01-27 00:10:28

标签: javascript prototype

我只是闯入Node.js和CommonJS模块,我正在尝试来扩展String对象,而不会乱丢我的应用程序的其余部分并提供一个干净的方法。

我想知道,将方法附加到全局String对象然后在文件底部delete它可以吗?

例如:

// hasCondition.js

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

// 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'

2 个答案:

答案 0 :(得分:1)

如果您不想使String空间混乱,可以创建一个新的Object,从String开始构建原型。然后,在其原型中为该对象分配has方法。它不会传播回String。

这样,你封装了它。当然,您添加了另一个间接层,但它已经是design pattern

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

示例(假设已定义断言):

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")

答案 1 :(得分:0)

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

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

如果你把它命名为一些非常模糊的东西,那么你很可能遇到这种情况,但它仍然不是最好的方法。通常,最好尽量保持代码在模块中封装,避免泄漏。

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