在原型的方法中弄乱这个

fra*_*nza 2 javascript prototype

好的,这是情况:

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

alert('a'.isVowel());
Run Code Online (Sandbox Code Playgroud)

它会提醒"假",因为this引用不是'a'它的原型.为了使它工作,我们需要做一点改变.

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

alert('a'.isVowel());
Run Code Online (Sandbox Code Playgroud)

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

但是,我们需要做些什么来使这个代码工作?

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

alert((5).is5()); //will alert 'false'
Run Code Online (Sandbox Code Playgroud)

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

lon*_*day 9

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

new String('a')是不一样的'a'.因此在阵列中找不到它.

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

return vowels.indexOf(this.valueOf()) !== -1;
Run Code Online (Sandbox Code Playgroud)

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


与数字相似:

 Number.prototype.is5 = function () { return this.valueOf() === 5; };
Run Code Online (Sandbox Code Playgroud)

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

Number.prototype.is5 = function () {
    "use strict";
    return this === 5;
};
Run Code Online (Sandbox Code Playgroud)

  • 对.因此,问题中的陈述,*"它将提醒'假',因为它不是'a'而是它的原型."*,是不正确的. (2认同)