在String.prototype中使用'this'

时间:2012-10-02 17:03:17

标签: javascript

对于各种javascript应用程序,我经常使用一个名为isBlank()的小函数:

isBlank = function(text) {
    while(text[0] == ' ') text = text.substr(1);
    return (text === '');
}

所有这个函数都是从输入字符串的开头删除所有空格,然后如果结果为空,则返回true或false。所以我试着把这个函数变成一个String原型,如下所示:

String.prototype.isBlank = function() {
    while(this[0] == ' ') this = this.substr(1);
    return (this === '');       
}

但是,当您尝试以下操作时,原型版本会出现“无效左手分配”错误:

"      ".isBlank();

ReferenceError: Invalid left-hand side in assignment

我想这个问题源于我在while循环中重新分配'this'对象的事实,但由于我还在学习java脚本,我想知道是否有人能够更详细地解释为什么这个原型不起作用。我对这个问题的理论方面更感兴趣,并且对如何将isBlank()函数变成符合我想要的字符串原型并不感兴趣。

谢谢!

3 个答案:

答案 0 :(得分:3)

你不能重新分配这个。这就是错误所说的。

ECMAScript spec

  

10.1.7此

     

这个值与每个活动的执行上下文相关联。   此值取决于调用者和代码类型   执行并在控制进入执行上下文时确定。   与执行上下文关联的此值是不可变的。

另一个链接explaining this

答案 1 :(得分:2)

您永远不能分配到this keyword。如果要分配,则需要创建一个额外的变量,如下所示:

String.prototype.isBlank = function() {
    var text = this;
    while(text[0] == ' ') text = text.substr(1);
    return (text === '');       
}

顺便说一下:并非所有浏览器都支持通过括号表示法访问单个字符,您应该使用.charAt()。此外,regular expression有时会让生活更轻松:

String.prototype.isBlank = function() {
    return /^ *$/.test(this);
}

答案 2 :(得分:1)

String.prototype.isBlank = function() {
    return (this.trim() === '');       
}