本次博客主要说下继承和聚合在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.youkuaiyun.com/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(","))
})()
其实聚合的方法,显得更加的简单,就是当我们取到原型链的上端时,然后将方法名和方法体赋值过来就行了,由于对象直接继承原型,所以原型链的函数就直接能够继承了。