如何在原型函数中设置对象属性(范围问题)?

时间:2010-09-21 04:18:04

标签: javascript prototype scope this

这是微不足道的,我已经忘记了。 可能有重复 - 我搜索了一下,发现类似,但找不到简洁。

   String.prototype.test = function(){this.bar = this.length + 2;}

   var str = "foo";
   str.test();

   console.log(str);                         // foo
   console.log(str.bar);                     // undefined

非常确定它与this被困在闭包中有关。

2 个答案:

答案 0 :(得分:1)

其原因是字符串文字不是对象。但是,在后台,当您调用带有文字的字符串函数时,例如“ foo” .toUpperCase(),javascript运行时所做的就是用新的String(“ foo”)包装字符串。无论如何,这只会在您调用一些预构建的String函数时发生,而在使用原型创建新函数时不会发生。

编辑:您只能重写对象的原型。这就是为什么需要新关键字的原因。

答案 1 :(得分:0)

在这种情况下,与您创建字符串的方式有关。尝试:

var str = new String("Foo");

你会发现它神奇地工作。 : - ]

查看示例: http://jsbin.com/odozo3/edit