javascript - 在原型(prototype)的方法中搞砸这个

标签 javascript prototype

好的,情况如下:

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/

相关文章:

arrays - 如何在 Typescript 4.0.3 中正确扩展数组原型(prototype)?

javascript - 从原型(prototype)函数更新对象值

Javascript __proto__ 输出

javascript - 关于javascript关闭的小问题

Javascript 与 C# 在 ASP.NET 4.5 MVC 中动态更改元素类/id

javascript - Symfony 3 多层嵌套表单

javascript - Prototype - 形成原型(prototype)监听器和 dom 监听器的集合

javascript - 从 AngularJS 中的另一个类访问 Controller 属性

javascript - mock fs.readFile - 单元测试

javascript - 检测 svg 元素中圆圈上的触摸移动