本次博客主要说下继承和聚合在javascript中的应用:
继承在前边的第五篇中也有所涉及,其实也挺简单的,
下面粘一段代码:
/** * 继承 */ (function(){ //创建一个人员类 function Person(name){ this.name = name; } //创建教师类 function Teacher(name,books){ //call方法可以将一个函数的对象上下文从初始化变成有this来决定 //调用Person的构造函数,因为Person没用new 所以他是个空对象 //相当于java中的super函数 Person.call(this,name); this.books = books; } //使老师类继承人员类 Teacher.prototype = new Person(); Teacher.prototype.constructor = Teacher; //给Teacher扩展一个函数 Teacher.prototype.getBook = function(){ return this.name +" "+ this.books; } //测试 var jim = new Teacher("JIM","EXTJS4"); //alert(jim.getBook()); /** * 创建Extend函数为了程序中石所有的集成操作 */ function extend(subClass,superClass){ //1.叫子类原型类属性等于父类的原型属性 //初始化一个中间空对象,为了转换主父类关系 var F = function(){}; F.prototype = superClass.prototype; //2.让子类集成F subClass.prototype = new F(); subClass.prototype.constructor = subClass; //3.为子类增加属性superClass subClass.superClass = superClass.prototype; //4.增加一个保险,就算你是的原型类是超类(Object) 那么也要把你的构造函数级别降下来 if(superClass.prototype.constructor == Object.prototype.constructor){ superClass.prototype.constructor = superClass; } } //测试 function Author(name,books){ Author.superClass.constructor.call(this,name); //Person.call(this,name); this.books = books; this.getBook = function(){ return this.name +" "+ this.books; } } //继承 extend(Author,Person); //彼德 var peter = new Author("YUNFENGCHENG","JAVASCIPT"); alert(peter.getBook()) })()
其实用到最多的就是下面两句:
//使老师类继承人员类 Teacher.prototype = new Person(); Teacher.prototype.constructor = Teacher;这两句的意思说的是:首先我将Teacher类的prototype的指针指向Person类,另外是将Teacher类的构造方法的指针还是让其指向自己。
其中call(),当然还要一个类似函数apply(),我们之后会专门拿出一篇文章来解释一下,ms我之前有转载过一篇写的不错的文章,大家可以找下,我也会将其引入这个专题来。
------------------------
好吧,我还是想忍不住想说一下call 和 apply的用法和简单的说下他们之间的不同,另外将我转载的一篇博客的地址放在这里,供大家参考。
call方法:
a.fun.call(b,"c","d");
简单的说来,它的意思就是a对象的fun函数可以叫b来执行,其中c和d是属于传入的参数,也就是说如果b来执行继承过来a的fun函数的时候,可以将其这两个参数调用;
call与apply之间的不同之处就是在后边参数的不同,call可以是任意类型,而apply必须是数组。
转载文章是:
http://blog.csdn.net/sunyingyuan/article/details/15048795
聚合:
有的时候不需要严格的继承,我们真正需要的是一个类(几个)中的的一些函数,有的时候我们又叫掺元类。
/** * 掺元类 * 有的时候不需要严格的继承,我们真正需要的是一个类(几个)中的的一些函数 * */ (function(){ //我们准备将要被聚合的函数 var JSON = { toJSONString :function(){ var outPut = []; for(key in this){ outPut.push(key+" --> "+this[key]) } return outPut; } }; /** * 聚合函数 */ function mixin(receivingClass,givingClass){ for(methodName in givingClass){ if(!receivingClass.__proto__[methodName]){ receivingClass.__proto__[methodName] = givingClass[methodName] } } } var o = {name:"YUN",age:27} mixin(o,JSON); document.write(o.toJSONString().join(",")) // JSON.prototype = { //如果说不用prototype // toJSONString :function(){ // var outPut = []; // for(key in this){ // outPut.push(key+" --> "+this[key]) // } // return outPut; // } // } // //制作聚合函数 // function mixin(receivingClass,givingClass){ // for(methodName in givingClass.prototype){ // //本类中没有这个函数的情况下我在聚合,否则跳过 // if(!receivingClass.prototype[methodName]){ // receivingClass.prototype[methodName] = givingClass.prototype[methodName] // } // } // } // //var o = {name:"YUN",age:27} // var o = function(){ // this.name = "YUN"; // this.age = 17 // } // mixin(o,JSON); // var a = new o(); // document.write(a.toJSONString().join(",")) })()其实聚合的方法,显得更加的简单,就是当我们取到原型链的上端时,然后将方法名和方法体赋值过来就行了,由于对象直接继承原型,所以原型链的函数就直接能够继承了。