代码改变世界

javascript学习(6)——[基础回顾]继承/聚合

2013-11-16 16:42  低调de草原狼  阅读(117)  评论(0编辑  收藏  举报

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