C#的扩展方法大家都知道不?就是可以为当前环境中的其他对象添加新的方法,即使你手中没有该对象的源代码。
JS就可以用原型来搞定!
Number.prototype.toHexString = function() {
return this.toString(16);
};
var iNum = 15;
alert(iNum.toHexString()); //输出 "F"
上面的代码,就为Number对象添加了一个新的方法,toHexString,到十六进制文本。
因为原型属性是该对象所有实例均具有的属性,类似静态,但可以获得this指针。
这样一来,为已有的对象添加原型属性就特别类似C#的扩展方法。其实不仅是类似,他根本就可以实现。
————
再举一个为Array增加indexOf函数的例子:
Array.prototype.indexOf = function (vItem) {
for (var i=0; i<this.length; i++) {
if (vItem == this[i]) {
return i;
}
}
return -1;
}
var aColors = new Array("red","green","blue");
alert(aColors.indexOf("green")); //输出 "1"
————
因为所有对象均源自Object,因此,如果想为所有对象添加一个新方法:
Object.prototype.showValue = function () {
alert(this.valueOf());
};
var str = "hello";
var iNum = 25;
str.showValue(); //输出 "hello"
iNum.showValue(); //输出 "25"
————
同时,利用它也可以重写对象的某函数:
Function.prototype.toString = function() {
return "Function code hidden";
}
function sayHi() {
alert("hi");
}
alert(sayHi.toString()); //输出 "Function code hidden"
上例就利用原型函数的“新换旧”覆盖,实现了对函数代码的隐藏(函数对象的toString会返回函数的实现代码)
————
自此,JS模拟面向对象的教程结束。感谢大家的阅读与支持!