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)
或者我们只是不需要触摸原型?
问题是所谓的拳击.如果你有一个原始值,然后调用该值的方法,它会被包装为类型的对象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)
| 归档时间: |
|
| 查看次数: |
82 次 |
| 最近记录: |