好的,情况如下:
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'
或者我们只是不需要触摸原型?
答案 0 :(得分:9)
问题是所谓的拳击。如果你有一个原始值,然后在该值上调用一个方法,它将被包装为String
,Number
,Boolean
类型的对象,或者你有什么。例如,这相当于调用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()时应该会出现错误,所以这些都可能只是发布的错别字。