在原型的方法中弄乱这个

时间:2013-12-06 19:28:06

标签: javascript prototype

好的,情况如下:

var vowels = ['a', 'i', 'y', 'e', 'o', 'u'];
String.prototype.isVowel = function () {
  return vowels.indexOf(this) !== -1;
};

alert('a'.isVowel());

它会提醒'false',因为this引用的不是'a',而是它的原型。为了使它成功,我们需要做一些改变。

String.prototype.isVowel = function () {
  return vowels.indexOf(this[0]) !== -1;
};

alert('a'.isVowel());

这将有效,因为String.prototype包含原始字符串的所有字符。实际上这是一个黑客,我不喜欢它。

但是我们需要做些什么来使这段代码有用呢?

Number.prototype.is5 = function () { return this === 5; }

alert((5).is5()); //will alert 'false'

或者我们只是不需要触摸原型?

2 个答案:

答案 0 :(得分:9)

问题是所谓的拳击。如果你有一个原始值,然后在该值上调用一个方法,它将被包装为StringNumberBoolean类型的对象,或者你有什么。例如,这相当于调用new String('a')。 (记录在the ECMAScript specification。)

new String('a')'a'不同。因此,在阵列中找不到它。

因此,您需要做的是将值转换回原始值。您始终可以使用valueOf方法完成此操作:

return vowels.indexOf(this.valueOf()) !== -1;

您的方法是致电this[0]。这是有效的,因为它从字符串中获取第一个字符作为基元,然后在字符串中找到它。缺点是ab也被这种方法视为元音。


与数字相似:

 Number.prototype.is5 = function () { return this.valueOf() === 5; };

另一点:这是Javascript的默认行为。正如您所示,它并不明显或不直观。在ECMAScript 5中,创建了“严格模式”,其中禁用了各种不良行为。自动拳击就是其中之一。因此,如果您使用现代浏览器,这将具有预期的行为:

Number.prototype.is5 = function () {
    "use strict";
    return this === 5;
};

答案 1 :(得分:0)

看看你声明String.prototype.isVowel的方式,它的工作原理令人满意。现在看Number.prototipe.is5()。看到差异?

  • prototipe拼写错误,应该是原型。

  • is5()之后不应该有()。

这让你知道:

Number.prototype.is5 = //...

设置Number.prototipe.is5()时应该会出现错误,所以这些都可能只是发布的错别字。