好的,情况如下:
var vowels = ['a', 'i', 'y', 'e', 'o', 'u'];
String.prototype.isVowel = function () {
return vowels.indexOf(this) !== -1;
};
alert('a'.isVowel());
它会从
this
开始提示“假”引用不是 'a'
但它的原型(prototype)。为了让它发挥作用,我们需要做一点改变。String.prototype.isVowel = function () {
return vowels.indexOf(this[0]) !== -1;
};
alert('a'.isVowel());
这将从
String.prototype
开始工作。包含原始字符串的所有字符。这实际上是一个 hack,我不喜欢它。但是我们需要做些什么来使这段代码工作呢?
Number.prototype.is5 = function () { return this === 5; }
alert((5).is5()); //will alert 'false'
或者我们只是不需要接触原型(prototype)?
最佳答案
问题是所谓的拳击。如果您有一个原始值,然后对该值调用方法,它将被包装为 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;
};
关于javascript - 在原型(prototype)的方法中搞砸这个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20432009/