重温Javascript继承机制(4)
作者:瓜瓜 发布时间:2011-07-04 12:17:23
四、”非构造函数”的如何实现继承
比如,现在有一个对象,叫做”MED”–营销体验设计。
var MED = {
aim:'营销体验设计'
}
还有一个对象,叫做”前端开发”。
var WD ={
skill:'html'
}
请问怎样才能让”前端开发”去继承”营销体验设计”,就是说,我怎样才能生成一个”营销体验设计的前端开发”对象?
这里要注意,这两个对象都是普通对象,不是构造函数,无法使用构造函数方法实现”继承”。
1、object()方法
Json格式的发明者Douglas Crockford,提出了一个object()函数,可以做到这一点。
function object(o) {
function F() {}
F.prototype = o;
return new F();
}
这个object()函数,其实只做一件事,就是把子对象的prototype属性,指向父对象,从而使得子对象与父对象连在一起。
使用的时候,第一步先在父对象的基础上,生成子对象:
var WD = object(MED);
然后,再加上子对象本身的属性:
WD.skill = 'html';
这时,子对象已经继承了父对象的属性了。
console.log(WD.aim); //营销体验设计
2、浅拷贝
除了使用”prototype链”以外,还有另一种思路:把父对象的属性,全部拷贝给子对象,也能实现继承。
下面这个函数,就是在做拷贝:
function LightCopy(p) {
var c = {};
for (var i in p) {
c[i] = p[i];
}
//c.uber = p;
return c;
}
使用的时候,这样写:
var WD = LightCopy(MED);
WD.aim = '前端开发';
但是,这样的拷贝有一个问题。那就是,如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能。
请看,现在给MED添加一个”技能”属性,它的值是一个数组。
MED.skills = ['‘html’','css','Javascript'];
通过LightCopy()函数,WD继承了MED。
var WD = LightCopy(MED);
然后,我们为WD的”技能”添加一个属性:
WD.skills.push('teamwork');
发生了什么事?MED的”技能”也被篡改了!
console.log(WD.skills); //‘html’,'Javascript','css','teamwork'
console.log(MED.skills); //‘html’,'Javascript','css','teamwork'
所以,LightCopy()只是拷贝基本类型的数据,我们把这种拷贝叫做”浅拷贝”。这是早期jQuery实现继承的方式。
3、深拷贝
所谓”深拷贝”,就是能够实现真正意义上的数组和对象的拷贝。它的实现并不难,只要递归调用”浅拷贝”就行了。
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 WD = deepCopy(MED);
现在,给父对象加一个属性,值为数组。然后,在子对象上修改这个属性:
MED.skills = ['‘html’','css','Javascript'];
WD.skills.push('teamwork');
这时,父对象就不会受到影响了。
console.log(WD.skills); //‘html’,'css','Javascript','teamwork' console.log(MED.skills); //‘html’,'css','Javascript'
目前,jQuery库使用的就是这种继承方法。


猜你喜欢
- 一、数组的创建方式一var a = new Array(); a[0]="wo"
- 学习python字符串方法的使用,对书中列举的每种方法都做一个试用,将结果记录,方便以后查询。(1) s.capitalize() ;功能:
- 目录json支持的格式:代码操作1.json转化为python2. python序列化为json总结json转化为python表示反序列化p
- 首先让我们首先看一个例子。我们知道在*NIX下面,uname命令是查看系统的发行版。可以写这样一个Fabric脚本:from fabric.
- 来源:http://stackoverflow.com/questions/3806562/ways-to-move-up-and-down
- 一、random模块简介Python标准库中的random函数,可以生成随机浮点数、整数、字符串,甚至帮助你随机选择列表序列中的一个元素,打
- 本文实例讲述了python访问系统环境变量的方法。分享给大家供大家参考。具体如下:#----------------------------
- 许多数据科学家认为获取和清理数据的初始步骤占工作的 80%,花费大量时间来清理数据集并将它们归结为可以使用的形式。因此如果你是刚刚踏入这个领
- 之前在训练网络的时候加载数据都是稀里糊涂的放进去的,也没有理清楚里面的流程,今天整理一下,加深理解,也方便以后查阅。pytorch+skle
- 在vue项目中需要监听window窗口变化来时时计算图片的高度,于是就加了一个监听事件;确实监听到了,但是在离开当前页面进入其他页面改变窗口
- this 的定义表示当前执行代码的环境对象 因此可将 this 的剖析分为“全局环境” 和 “函数环境” 两种类型的环境对象全局环
- 本文介绍了python实现快速排序的示例(二分法思想),分享给大家,具体如下:实现思路将所需要的数字存入一个列表中1.首先,设置将最左侧的那
- 1、创建Django项目打开pycharm,新建Django项目,可以选择一个虚拟环境建完之后目录如下:2、创建应用,我这里命名为demo在
- 背景在写代码过程中,如果有频繁重复性的编码操作,或者可以Reuse的各类代码,可以通过Python写一个脚本,自动生成这类代码,就不用每次手
- 前言上一篇文章介绍了怎么配置机器人框架,并且实现了一些简单的功能。(发送私聊或者群聊信息、接收上报的事件、简单的自动回复等等)这次为了让QQ
- 本文实例讲述了Python基于socket模块实现UDP通信功能。分享给大家供大家参考,具体如下:一 代码1、接收端import socke
- cv的xdm可以直接翻到 需求 和 代码 用,想看中间的分析就老实往下看吧little 背景最近在做毕设,需要将几百篇整体结构差不多的文章中
- 今天使用ab(apacheBench)测试了一下beego的性能。3Kbytes动态文件,在i3上可以达到每秒1W次响应的性能。但是在测试静
- 前段时间在生活中偶尔需要对某些文件进行重命名,而且是随机名字,刚开始是手动重命名然后在键盘上胡乱打一些字母数字,时间长了发现也挺麻烦的,于是
- 前言在之前写过一篇博客"关系数据库如何快速查询表的记录数",里面介绍了使用sp_spaceused查看表的记录数是否正确