前言

本篇适合前端新人,下面开始......

对于前端新手来说(比如博主),每当对js的对象做操作时,都是一种痛苦,原因就是在于对象的赋值是引用的传递,并非值的传递,虽然看上去后者赋值给了前者,他们就各奔东西了,但是他们却紧紧相连,为了解决这一问题,我们需要从根源上来切断对象赋值时就对象与新对象之间的藕断丝连......

拷贝

我们寻找方法时候,找到了拷贝这个方法,就是把要赋值的对象的属性一个一个加到新对象中去,所以我们得到了clone方法:

function clone (obj) {
var news = {}
for (var key in obj) {
news[key] = obj[key]
}
return news
}

但是新问题又来了,我的新对象并不是空的,我的新对象还有其他属性,以上这个方法并不适用了,怎么办......

继承

对于继承这个名词,大家并不陌生,该有的留下,该继承的加进来,该覆盖的覆盖掉。于是我们稍微修改了一下上面的代码,得到了extend方法:

function extend(target, obj) {

  for (var key in obj) {
target[key] = obj[key]
}
return target
}

我们把目标对象穿进去,把继承对象中的属性依依加到目标对象。最后,我们返回目标对象,虽然不比这么做目标对象已经改变,不过我们还是这样做吧。

深拷贝

问题总是不断的发现,现在我们又有问题了,我们在继承过程中,如果某一个属性值是一个对象,那么我们的继承函数仍然有引用传递,这样一来仍然联系不断!怎么办呢?这时候大牛们变引发了深拷贝这个名词,顾名思义,如果对象中还有对象,那么一层一层的拷贝下去吧,不信你能有10086层对象嵌套。

深拷贝的核心是递归继承,碰到属性值为对象,就触发递归继承。在这里,你可能想到了jQuery等功能库,的确,他们都有extend方法来实现深拷贝,但我觉得不完美,因为我们需要依靠自己的力量,不能仅仅依赖别人,因此我们又需要继续探索.....

JSON的妙用

在我们探索如果深拷贝时,JSON对象缺在偷偷地笑,我问他在笑什么,他跟我说了这样的话:

  

var obj1 = {
name: 'xu',
age: 21,
native: {
weight: 70,
height: 170
}
... //许多属性
} var obj2 = clone(obj1) // 浅拷贝,未断开联系 var obj2 = JSON.parse(JSON.stringify(obj1)) // 深拷贝,成功断开

他告诉我说:你的clone是不行滴,我给你两个方法,分分钟让对象断子绝孙。于是,我就学会了这样进行深拷贝。但是需求还是远远不够,在现实项目中,我们需要的是在继承中深拷贝,于是我们继续探索,终于......

function deepExtend (target, obj) {
var clone
for (var key in obj) {
clone = obj[key]
if (typeof clone === 'object') { // 只考虑数组和对象两种情况
target[key] = JSON.parse(JSON.stringify(clone))
} else {
target[key] = clone
}
}
return target
}

好吧,我们写出了上面这个简单的继承,不过感觉很瑕疵,万一我们需要给目标对象继承多个对象怎么办?我们如何控制是否深拷贝?低版本浏览器ie678中JSON无效怎么办?好吧,不要问了,容我再想想。

最终的继承

为了解决一系列的问题,最终我给出了一下继承方法,此继承方法类似于jQuery.extend,实际也差不多,不过相比简单易懂(个人觉得),因为加了大量汉语注释,适合新手们。

function extend () {
// arguments种类
// [deep] 可选,标注是否为深度继承
// target 第一个对象,则为目标对像
// options 之后的对象,都视为继承对象
var args = arguments,
target = args[0], // 假设第一个参数为目标对象
len = args.length, // 获取参数总长度
i = 1, // 假设继承对象从下标为1开始
deep = false, // 初始化为浅拷贝
tar, source, option, key
// 如果第一个参数是布尔值,那么第二个参数做为目标对象
if (typeof target === 'boolean') {
deep = target
target = args[i++]
}
// 遍历继承对象,并将每一个都继承到目标对象中
for (; i < len; i++) { option = args[i] for (key in option) {
tar = target[key]
source = option[key]
// 如果为深拷贝并且此时的属性值为对象,则进行递归拷贝
if (deep && typeof source === 'object') {
if (!tar) { // 如果目标对象没有此属性,那么创建它
tar = Object.prototype.call(source) === '[object Array]'? []: {}
}
// 将递归拷贝的结果赋值给目标对象
target[key] = assign(deep, tar, source)
} else{
// 如果为浅拷贝,直接赋值
target[key] = source
}
}
}
return target
}

最后的结尾

很遗憾本菜只能有这些本事了, 帖子内容不少,大多是废话,新人可以看一下,如果觉得有帮助,就点个赞吧~~~~

javascript中的继承与深度拷贝的更多相关文章

  1. JavaScript学习13 JavaScript中的继承

    JavaScript学习13 JavaScript中的继承 继承第一种方式:对象冒充 <script type="text/javascript"> //继承第一种方式 ...

  2. 浅谈JavaScript中的继承

    引言 在JavaScript中,实现继承的主要方式是通过原型链技术.这一篇文章我们就通过介绍JavaScript中实现继承的几种方式来慢慢领会JavaScript中继承实现的点点滴滴. 原型链介绍 原 ...

  3. JavaScript中的继承(原型链)

    一.原型链 ECMAScript中将原型链作为实现继承的主要方法,基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法. 实例1: function SupType() { this.pro ...

  4. 彻底搞懂JavaScript中的继承

    你应该知道,JavaScript是一门基于原型链的语言,而我们今天的主题 -- "继承"就和"原型链"这一概念息息相关.甚至可以说,所谓的"原型链&q ...

  5. 浅谈 JavaScript 中的继承模式

    最近在读一本设计模式的书,书中的开头部分就讲了一下 JavaScript 中的继承,阅读之后写下了这篇博客作为笔记.毕竟好记性不如烂笔头. JavaScript 是一门面向对象的语言,但是 ES6 之 ...

  6. 关于JavaScript中实现继承,及prototype属性

    感谢Mozilla 让我弄懂继承. JavaScript有八种基本类型,函数属于object.所以所有函数都继承自object.//扩展:对象,基本上 JavaScript 里的任何东西都是对象,而且 ...

  7. javascript中各种继承方式的优缺点

    javascript中实现继承的方式有很多种,一般都是通过原型链和构造函数来实现.下面对各种实现方式进行分析,总结各自的优缺点. 一 原型继承 let Super = functioin(name = ...

  8. javascript中实现继承的几种方式

    javascript中实现继承的几种方式 1.借用构造函数实现继承 function Parent1(){ this.name = "parent1" } function Chi ...

  9. 深入理解JavaScript中的继承

    1前言 继承是JavaScript中的重要概念,可以说要学好JavaScript,必须搞清楚JavaScript中的继承.我最开始是通过看视频听培训班的老师讲解的JavaScript中的继承,当时看的 ...

随机推荐

  1. mobx @computed的解读

    写在前面:我一开始看不懂官网的@computed的作用,因为即使我把@computed去掉,依然能正确的report,然后我百度谷歌都找不到答案,下面都是我自己的理解,如果是有问题的,不对的,请务必留 ...

  2. 在Ubuntu下搭建ASP.NET 5开发环境

    在Ubuntu下搭建ASP.NET 5开发环境 0x00 写在前面的废话 年底这段时间实在太忙了,各种事情都凑在这个时候,没时间去学习自己感兴趣的东西,所以博客也好就没写了.最近工作上有个小功能要做成 ...

  3. [NodeJS] 优缺点及适用场景讨论

    概述: NodeJS宣称其目标是“旨在提供一种简单的构建可伸缩网络程序的方法”,那么它的出现是为了解决什么问题呢,它有什么优缺点以及它适用于什么场景呢? 本文就个人使用经验对这些问题进行探讨. 一. ...

  4. 了不起的 nodejs-TwitterWeb 案例 bug 解决

    了不起的nodejs算是一本不错的入门书,不过书中个别案例存在bug,按照书中源码无法做出和书中相同效果,原本兴奋的心情掺杂着些许失落. 现在我们看一下第七章HTTP,一个Twitter Web客户端 ...

  5. 中国CIO最关心的八大问题(下)

    中国CIO最关心的八大问题(下) 从调研数据还可以看出,在企业级IT建设与投资上,CIO们并非是一群狂热的技术信徒,他们更多的是从企业发展阶段.信息化程度.技术成熟度.ROI等方面进行综合评估. 五. ...

  6. 一些关于Linux入侵应急响应的碎碎念

    近半年做了很多应急响应项目,针对黑客入侵.但疲于没有时间来总结一些常用的东西,寄希望用这篇博文分享一些安全工程师在处理应急响应时常见的套路,因为方面众多可能有些杂碎. 个人认为入侵响应的核心无外乎四个 ...

  7. 【repost】JS中的异常处理方法分享

    我们在编写js过程中,难免会遇到一些代码错误问题,需要找出来,有些时候怕因为js问题导致用户体验差,这里给出一些解决方法 js容错语句,就是js出错也不提示错误(防止浏览器右下角有个黄色的三角符号,要 ...

  8. 记从安装centos系统在到使用mono3.2部署MVC过程遇到的问题

    一.安装虚拟机并安装配置系统 我不太愿意去下载vmware就用系统里面自带的Hyper-V 系统我选择了最新版本的CentOs6.4 下载地址:http://mirrors.163.com/cento ...

  9. 通过Mono 在 Heroku 上运行 .NET 应用

    英文原文:Running .NET on Heroku 中文原文:在 Heroku 上运行 .NET 应用 自从加入了Heroku之后,我就想在这个平台上运行.NET程序.现在我很高兴向大家宣布,我们 ...

  10. [Xamarin] 透過Native Code呼叫 JavaScript function (转帖)

    今天我們來聊聊關於如何使用WebView 中的Javascript 來呼叫 Native Code 的部分 首先,你得先來看看這篇[Xamarin] 使用Webview 來做APP因為這篇文章至少講解 ...