Javascript面向对象编程(三) 非构造函数的继承


Posted in Javascript onAugust 28, 2011

今天是最后一个部分,介绍不使用构造函数实现"继承"。
一、什么是"非构造函数"的继承?
比如,现在有一个对象,叫做"中国人"。

var Chinese = { 


nation:'中国' 

};

还有一个对象,叫做"医生"。
var Doctor ={ 


career:'医生' 

}

请问怎样才能让"医生"去继承"中国人",也就是说,我怎样才能生成一个"中国医生"的对象?
这里要注意,这两个对象都是普通对象,不是构造函数,无法使用构造函数方法实现"继承"。
二、object()方法
json格式的发明人Douglas Crockford,提出了一个object()函数,可以做到这一点。
function object(o) { 


function F() {} 


F.prototype = o; 


return new F(); 

}

这个object()函数,其实只做一件事,就是把子对象的prototype属性,指向父对象,从而使得子对象与父对象连在一起。
使用的时候,第一步先在父对象的基础上,生成子对象:

var Doctor = object(Chinese);
然后,再加上子对象本身的属性:

Doctor.career = '医生';
这时,子对象已经继承了父对象的属性了。

alert(Doctor.nation); //中国
三、浅拷贝
除了使用"prototype链"以外,还有另一种思路:把父对象的属性,全部拷贝给子对象,也能实现继承。
下面这个函数,就是在做拷贝:

function extendCopy(p) { 


var c = {}; 


for (var i in p) { 



c[i] = p[i]; 


} 


c.uber = p; 


return c; 

}

使用的时候,这样写:
var Doctor = extendCopy(Chinese); 

Doctor.career = '医生'; 

alert(Doctor.nation); // 中国

但是,这样的拷贝有一个问题。那就是,如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能。
请看,现在给Chinese添加一个"出生地"属性,它的值是一个数组。

Chinese.birthPlaces = ['北京','上海','香港'];
通过extendCopy()函数,Doctor继承了Chinese。

var Doctor = extendCopy(Chinese);
然后,我们为Doctor的"出生地"添加一个城市:

Doctor.birthPlaces.push('厦门');
发生了什么事?Chinese的"出生地"也被改掉了!

alert(Doctor.birthPlaces); //北京, 上海, 香港, 厦门

alert(Chinese.birthPlaces); //北京, 上海, 香港, 厦门
所以,extendCopy()只是拷贝基本类型的数据,我们把这种拷贝叫做"浅拷贝"。这是早期jQuery实现继承的方式。
四、深拷贝
所谓"深拷贝",就是能够实现真正意义上的数组和对象的拷贝。它的实现并不难,只要递归调用"浅拷贝"就行了。

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);
现在,给父对象加一个属性,值为数组。然后,在子对象上修改这个属性:

Chinese.birthPlaces = ['北京','上海','香港']; 

Doctor.birthPlaces.push('厦门');

这时,父对象就不会受到影响了。
alert(Doctor.birthPlaces); //北京, 上海, 香港, 厦门 

alert(Chinese.birthPlaces); //北京, 上海, 香港

目前,jQuery库使用的就是这种继承方法。
(完)
Javascript 相关文章推荐
js的event详解。
Sep 06 Javascript
javascript实现类似超链接的效果
Dec 26 Javascript
AngularJs解决跨域问题案例详解(简单方法)
May 19 Javascript
Node.js 文件夹目录结构创建实例代码
Jul 08 Javascript
react-router中的属性详解
Jun 01 Javascript
微信小程序中上传图片并进行压缩的实现代码
Aug 28 Javascript
layDate日期控件使用方法详解
Nov 15 Javascript
微信小程序提交form操作示例
Dec 30 Javascript
解决微信小程序中转换时间格式IOS不兼容的问题
Feb 15 Javascript
javascript实现手动点赞效果
Apr 09 Javascript
微信小程序实现注册登录功能(表单校验、错误提示)
Dec 10 Javascript
electron+vue实现div contenteditable截图功能
Jan 07 Javascript
Javascript面向对象编程(二) 构造函数的继承
Aug 28 #Javascript
Javascript 面向对象编程(一) 封装
Aug 28 #Javascript
Javascript继承机制的设计思想分享
Aug 28 #Javascript
有关JavaScript的10个怪癖和秘密分享
Aug 28 #Javascript
JS面向对象编程浅析
Aug 28 #Javascript
用JS实现一个TreeMenu效果分享
Aug 28 #Javascript
JS target与currentTarget区别说明
Aug 28 #Javascript
You might like
PHP实现的博客欢迎提示功能(很特别哦)
2014/06/05 PHP
CodeIgniter安全相关设置汇总
2014/07/03 PHP
PHP简单字符串过滤方法示例
2016/09/04 PHP
win10下 php安装seaslog扩展的详细步骤
2020/12/04 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题
2007/01/09 Javascript
javascript demo 基本技巧
2009/12/18 Javascript
window.open()详解及浏览器兼容性问题示例探讨
2014/05/29 Javascript
JavaScript对数组进行随机重排的方法
2015/07/22 Javascript
基于Arcgis for javascript实现百度地图ABCD marker的效果
2015/09/12 Javascript
详解js私有作用域中创建特权方法
2016/01/25 Javascript
基于Vue.js实现tab滑块效果
2017/07/23 Javascript
微信小程序中使用Promise进行异步流程处理的实例详解
2017/08/17 Javascript
[js高手之路]原型式继承与寄生式继承详解
2017/08/28 Javascript
vue下载excel的实现代码后台用post方法
2019/05/10 Javascript
浅谈bootstrap layer.open中end的使用方法
2019/09/12 Javascript
使用layui实现树形结构的方法
2019/09/20 Javascript
Vuejs中的watch实例详解(监听者)
2020/01/05 Javascript
原生JS实现九宫格抽奖
2020/09/13 Javascript
[01:20]辉夜杯背景故事宣传片《辉夜传说》
2015/12/25 DOTA
python中实现php的var_dump函数功能
2015/01/21 Python
《Python之禅》中对于Python编程过程中的一些建议
2015/04/03 Python
python保存字符串到文件的方法
2015/07/01 Python
Ubuntu下安装PyV8
2016/03/13 Python
代码分析Python地图坐标转换
2018/02/08 Python
详解python深浅拷贝区别
2019/06/24 Python
Python数据分析模块pandas用法详解
2019/09/04 Python
python 读txt文件,按‘,’分割每行数据操作
2020/07/05 Python
CSS3 transform的skew属性值图文详解
2014/07/21 HTML / CSS
IE8下CSS3选择器nth-child() 不兼容问题的解决方法
2016/11/16 HTML / CSS
古驰英国官网:GUCCI英国
2020/03/07 全球购物
个人思想理论学习的自我鉴定
2013/11/30 职场文书
创业计划书如何编写
2014/02/06 职场文书
捐助贫困学生倡议书
2014/05/16 职场文书
医院领导班子四风问题对照检查材料
2014/10/26 职场文书
2015年体检中心工作总结
2015/05/27 职场文书
python scrapy简单模拟登录的代码分析
2021/07/21 Python