Javascript对象深拷贝与继承
javascript是面向对象的语言,不过这句饱受争议,有人说是面向对象,但有人说是基于对象。
这个说的比较在理:基于类的面向对象(代表案例:java,c#)和基于原型的面向对象(代表案例:javascript)。
文中提出面向对象的几大特征:
一切事物皆对象
对象具有封装和继承特性
对象与对象之间使用消息通信,各自存在信息隐藏
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
收藏随意^^请保留教程地址.
评论已关闭