在es6中扩展String类

时间:2015-05-15 11:05:07

标签: javascript string ecmascript-6

我可以在es5中写下以下内容:

String.prototype.something=function(){
  return this.split(' ').join('');
};

如何使用新功能在es6中执行相同的操作?

PS:我知道这也是一个有效的es6。我不知道在es6中是否还有其他方法可以实现更短的这些功能? 以上功能只是一个例子。

2 个答案:

答案 0 :(得分:13)

在ES6中,您也可以使用Object.assign()这样做:

Object.assign(String.prototype, {
    something() {
        return this.split(' ').join();
    }
});

您可以找到方法here的更多信息。

或者您可以使用defineProperty(我认为这会更好):

Object.defineProperty(String.prototype, 'something', {
    value() {
        return this.split(' ').join();
    }
});

请参阅文档here

请参阅我的评论,了解何时使用defineProperty vs Object.assign()

答案 1 :(得分:5)

您的提案在ES6中运行正常,它有什么问题吗?

如果您想要实际扩展String,而不是仅仅向String添加方法,并获得温暖的ES6感觉,您可以尝试:

class MyString extends String {
    something() { return this.split(' ').join(''); }
}

但是,您将很快遇到扩展内置类的限制。有可能你会看到可怕的

TypeError: String.prototype.toString is not generic

错误消息(这是来自babel-node)。