代码改变世界

javascript object oriented programming (三)

2011-06-19 12:36  jalen  阅读(248)  评论(0编辑  收藏  举报
/*
   *非构造函数,那就是只要不是构造函数的
   * 两个对象都是普通对象,不是构造函数,无法使用构造函数方法实现"继承"。
   * json格式的发明人Douglas Crockford,提出了一个object()函数,可以做到这一点。
  */
   var chinese = {
		nation:"中国"
	}

	var Doctor = {
		career:'医生'
	}
	//
	function object(o){
		//创建一个空的构造函数F,F的prototype是o(父对象,或者叫要被继承的对象)对象的引用,
		//也就是说F.prototype指向需要继承的对象
		function F(){}
		F.prototype = o;
		//返回F构造函数的实例化对象,这样F的实例化对象就有个对父对象的引用了。
		return new F();
	}

	var Doctor = object(chinese);
	Doctor.career = '医生';       //然后,再加上子对象本身的属性: 这步不需要也能继承到!
	console.log(Doctor.nation)	  // 中国    子对象已经继承了父对象的属性了。

	  /*
		* 三、浅拷贝 (拷贝基本类型的数据)这是早期jQuery实现继承的方式。
		*     除了使用"prototype链"以外,还有另一种思路:把父对象的属性,全部拷贝给子对象,也能实现继承。
	  */
		var chinese = {
			nation:"中国",
			birthPlaces :['北京','上海','香港']
		}
		var Doctor = {
			career:'医生'
		}
		function extendCopy(p){
			var c = {}				//创建一个空对象,用于存储要拷贝的属性
			for(var i in p){
				c[i] = p[i];
			}
			c.uber = p;				//子对象的一个属性对父对象的引用,备用属性~
			return c;
		}
		var Doctor = extendCopy(chinese);
		//如果修改了Doctor.birthPlaces 的属性值,chinese.birthPlaces也会受到影响
		Doctor.birthPlaces.push('厦门');
		console.log(Doctor.nation);

		console.log(Doctor.birthPlaces);
		console.log(chinese.birthPlaces);
	 /*
	  * 四、深拷贝 目前,jQuery库使用的就是这种继承方法。
	  *	所谓"深拷贝",就是能够实现真正意义上的数组和对象的拷贝。它的实现并不难,只要递归调用"浅拷贝"就行了。
	 */
	 var chinese = {
    nation:"中国",
    birthPlaces :['北京','上海','香港']
	}
	var Doctor = {
		career:'医生'
	}
	function deepCopy(p,c){
		var c = c || {};
		for(var i in p){
			if(typeof p[i] ==='object'){
				c[i] = (p[i].constructor === Array) ? [] :{};
				deepCopy(p[i],c[i]);
			}else{
				c[i] = p[i];
			}
		}
	 return c;
	}
	var Doctor = deepCopy(chinese);
	//现在,给父对象加一个属性,值为数组。然后,在子对象上修改这个属性:

	Doctor.birthPlaces.push('厦门');
	console.log(Doctor.nation);
	console.log(Doctor.birthPlaces); //["北京", "上海", "香港", "厦门"]
	//这时,父对象就不会受到影响了。
	console.log(chinese.birthPlaces); //["北京", "上海", "香港"]

非构造函数的继承

学习笔记,记录学习过程的地方。

原文链接:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance_continued.html