您的位置:首页 > 其它

【09类和模块】——4:类的扩充

2016-03-27 22:12 134 查看
我们在这里应该明白一点——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:构造函数名称
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: