首页 > Javascript > Javascript对象深拷贝与继承

Javascript对象深拷贝与继承

javascript是面向对象的语言,不过这句饱受争议,有人说是面向对象,但有人说是基于对象。

这个说的比较在理:基于类的面向对象(代表案例:java,c#)和基于原型的面向对象(代表案例:javascript)

文中提出面向对象的几大特征:

  1. 一切事物皆对象

  2. 对象具有封装和继承特性

  3. 对象与对象之间使用消息通信,各自存在信息隐藏

javascript中没有类的概念,一切皆对象,文中还提出属性隐藏机制,同样可以实现封装和继承。

暂且不讨论是基于对象还是面向对象了,这里要实现的就是javascript中对象的拷贝与继承的问题,也是我们平时用的比较多的案例。

javascript的所有function类型的对象都要有一个prototype属性。这个prototype属性本身又是一个object类型对象,因此我们可以给这个prototype对象添加任意的属性和方法。既然prototype是对象的"原型",那么由该函数构造出来的对象应该都会具有这个"原型"的特征。事实上,在构造函数prototype上定义的所有属性和方法,都是可以通过构造的对象直接访问和调用的。也可以这么说,prototype提供了一群同类对象共享属性和方法的机制。javascript支持基于原型的继承,可以理解为对象继承是通过复制父类(对象)的方法和属性实现的。

实现机制如下:

/**
 * 深复制对象
 */
(function () {
	Object.clone =  function (obj) {
		var newO = {};
		if (obj instanceof Array) {  
			newO = [];
		}
		for (var key in obj) {
			var val = obj[key];
			newO[key] = typeof val === 'object' ? arguments.callee(val) : val;
		}
		return newO;
	};
	
	Object.extend = function(tObj, sObj){
		for(var i in sObj){
			if(typeof sObj[i] !== 'object'){
				tObj[i] = sObj[i];
			}else if (sObj[i] instanceof Array){
				tObj[i] = Object.clone(sObj[i]);
			}else{
				tObj[i] = tObj[i] || {};
				Object.extend(tObj[i], sObj[i]);
			}
		}
	}

	//clone测试
	var test = {
		"a":1,
		"b":2,
		"c":3,
	};
	var test1 = Object.clone(test);
	var test2 = test;
	test1.a = 'test1';
	test.b = 'test';
	test2.c = 'test2';
	console.log(test);	//Object {a: 1, b: "test", c: "test2"}
	console.log(test1);	//Object {a: "test1", b: 2, c: 3}
	console.log(test2); //Object {a: 1, b: "test", c: "test2"}
	
	
	//extend测试
	//索引数组
	var test3 = [0, 1, 2, 'c', 'd'];
	var test4 = ['a', 'b'];
	Object.extend(test3, test4);		//test3获得了test4的所有属性,且test3的前2个属性被test4的前2个属性覆盖
	console.log(test3);
	
	//对象,相当于关联数组,这就是我们常用的extend(settings, options);
	var test5 = {a:'a', b:'b', c:'c', d:'d', e:'3'};
	var test6 = {c:'c', d:'d', e: 'e', f: 'f'};
	Object.extend(test5, test6);		//test3获得了test4的所有属性,且test3的前2个属性被test4的前2个属性覆盖
	console.log(test5);
})();

附上那篇文章的结束语

JavaScript 被认为是世界上最受误解的编程语言,因为它身披 c 语言家族的外衣,表现的却是 LISP 风格的函数式语言特性;没有类,却实也彻底实现了面向对象。要对这门语言有透彻的理解,就必须扒开其 c 语言的外衣,从新回到函数式编程的角度,同时摒弃原有类的面向对象概念去学习领悟它。随着近些年来 Web 应用的普及和 JS 语言自身的长足发展,特别是后台 JS 引擎的出现 ( 如基于 V8 的 NodeJS 等 ),可以预见,原来只是作为玩具编写页面效果的 JS 将获得更广阔发展天地。这样的发展趋势,也对 JS 程序员提出了更高要求。只有彻底领悟了这门语言,才有可能在大型的 JS 项目中发挥她的威力。




本文链接:http://blog.zhengshuiguang.com/js/extend.html

收藏随意^^请保留教程地址.

标签:clone extend prototype 面向对象 基于对象 克隆 继承

评论已关闭