我只是闯入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'
答案 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”方法。不用担心,因为您将自行清理并删除您添加的方法。你知道接下来会发生什么......他们试图使用他们的方法,突然之间它是未定义的!
如果你把它命名为一些非常模糊的东西,那么你很可能遇到这种情况,但它仍然不是最好的方法。通常,最好尽量保持代码在模块中封装,避免泄漏。
在这种情况下,您可能需要创建自己的字符串构造函数,您可以使用它并使用自定义方法扩展到您的内容,而不必担心在模块外部泄漏增强功能。