我们在这里应该明白一点——javascript中基于原型的继承机制是动态的:对象从其原型继承属性,如果创建对象之后原型的属性发生了变化,也会影响到继承这个原型的所有实例对象。这就意味着我们可以通过给原型对象添加新方法来扩充javascript类。
既然这样,我们就可以给博文【09类和模块】——3:javascript中java式的类继承 中的Complex类添加新的方法
这里我们给Complex类添加一个计算复数共轭复数(两个实部相等,虚部互为相反数的两个复数互为共轭复数)的方法
//返回当前复数的共轭复数
Complex.prototype.conj = function(){
return new Complex(this.r,-this.i)
}
javascript内置类的原型对象也是一样如此“开放”,也就是说可以给数字、字符串、数组、函数等数据类型添加方法;
例如:假设函数类上面没有bind()方法,我们通过类的扩展的方式给函数类添加一个bind()方法
if(!Function.prototype.bind){
Function.prototype.bind=function(o/*,agrs*/){
//bind()方法的代码....
}
}
这里还有一些其他的例子
//多次调用一个函数f,传入一个迭代数
//比如,要输出“hello”三次
Number.prototype.times=function(f,context){
var n=Number(this);
for(var i=0;i<n;i++){
f.call(context,i)
}
}
调用函数
var n=3;
n.times(function(n){console.log(n+'hellow')});
假设String中不存在trim()方法,我们在这里通过类的扩展的方式来定义trim()方法
String.prototype.trim=String.prototype.trim||function(){
if(!this) return this //空字符串不做处理
return this.replace(/^\s+|\s+$/g,"")//使用正则替换空格
}
当然也可以给Object.prototype添加方法,从而使所有的对象都可以调用这些方法,但是这样的做法是不被推荐的,因为在ECMAScript5之前,是无法将这些新增的方法设置为不可枚举的(一个方法不可枚举才更像是内置的方法),如果给Object.prototype添加属性,这些属性是可以被for/in循环遍历到的。
期待阅读下一篇博文:【09类和模块】——5:构造函数名称
本文介绍如何在JavaScript中给已有类添加新方法,包括计算复数的共轭复数,以及为函数、数字、字符串等内置类型扩展功能。
1159

被折叠的 条评论
为什么被折叠?



