Javascript 在原型中混淆视听';s法

Javascript 在原型中混淆视听';s法,javascript,prototype,Javascript,Prototype,好的,情况如下: var vowels = ['a', 'i', 'y', 'e', 'o', 'u']; String.prototype.isVowel = function () { return vowels.indexOf(this) !== -1; }; alert('a'.isVowel()); 它将警告'false',因为此引用的不是'a',而是其原型。为了让它发挥作用,我们需要做一些改变 String.prototype.isVowel = function () {

好的,情况如下:

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

alert('a'.isVowel());
它将警告'false',因为
引用的不是
'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'

或者我们不需要接触原型?

问题是什么叫做装箱。如果您有一个基元值,然后对该值调用一个方法,那么它将被包装为
字符串
数字
布尔值
,或您拥有的类型的对象。例如,这相当于调用
新字符串('a')
。(记录在中。)

新字符串('a')
'a'
不同。因此在数组中找不到它

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

return vowels.indexOf(this.valueOf()) !== -1;
您的方法是调用此[0]。这是可行的,因为它从字符串中获取第一个字符作为基元,然后在字符串中找到基元。缺点是,
ab
也会被这种方法视为元音


与数字类似:

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

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

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

看看您声明
String.prototype.isVowel
的方式,这是可以接受的。现在看看
Number.prototipe.is5()
。看到区别了吗

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

  • is5()后面不应该有()

这就给你留下了这样一个问题:

Number.prototype.is5 = //...

你应该在设置Number.prototipe.is5()时出错,所以可能这些都是发帖时的拼写错误。

现在“Y”是元音吗?在(英国)英语中,我敢肯定不是,“y”有时是元音。你的假设是错误的<代码>此不涉及原型。它只是指一个字符串对象,而不是字符串原语。另外,“这将起作用,因为string.prototype包含原始字符串的所有字符。”是不正确的。字符串的字符不存储在原型上。如果是这样,则意味着每个字符串都有相同的值,而我们知道这不是真的;)为了说服自己,检查
console.dir(新字符串('foo'))的输出。请注意,字符存储在字符串对象本身上,而不是它的原型上。@Givi:我只想指出原型的属性是共享的,因此如果原型发生了变化,所有实例都会受到影响。因此,如果字符串的实际值存储在原型上,那么每个字符串实例都将具有相同的值。或者换一种说法:始终只能有一个字符串值,即上一个实例化字符串的值(它将“覆盖”上一个字符串的值)。这有意义吗?这更像是一个思想实验,而不是一个技术解释。因此,问题中的语句“它将警告'false',因为它引用的不是'a',而是它的原型”。这是不正确的。顺便说一句,它相当于调用
新字符串('a')
<代码>字符串('a')
将返回一个原语。是的,谢谢,我纠正了我的错误,但我的问题仍然有道理。但这并不完全正确