3

我只是闯入 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'
4

2 回答 2

1

如果你不想弄乱字符串空间,你可以创建一个新的对象,从一个字符串原型。然后,为该对象分配has其原型中的方法。它不会传播回字符串。

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

如果您只是担心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")
于 2013-01-27T00:32:43.413 回答
0

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

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

如果您将其命名为非常晦涩的名称,那么您不太可能会遇到这种情况,但这仍然不是最好的方法。一般来说,最好尽量让你的代码尽可能地封装在模块中并避免泄漏。

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

于 2013-01-27T00:47:40.317 回答