深度拷贝
上一节所说到的extendCopy再深一层的对象属性是不能复制的,下面我们就学习另一个拷贝方法。
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;
}
前几节我们说到了要注意引用复制,改变copy对象,也会改变初始的对象,而深度拷贝完全避免了这个问题。
来创建一个复杂的对象
var parent = {
numbers: [1, 2, 3],
letters: ['a', 'b', 'c'],
obj: {
prop: 1
},
bool: true
};
让我们测试一下深度拷贝和extendCopy的区别
var mydeep = deepCopy(parent);
var myshallow = extendCopy(parent);
mydeep.numbers.push(4,5,6);
mydeep.numbers;//[1,2,3,4,5,6]
parent.nubmers;//[1,2,3] 不会影响初始的对象
myshallow.numbers.push(10);//4
myshallow.numbers;//[1,2,3,10]
parent.numbers;//[1,2,3,10] //改变了初始的对象
深度拷贝的想法来自Jquery。。。
Object()
从上面的继承方法受到了启发。建议使用object方法实现继承
function object(o) {
function F() {}
F.prototype = o;
return new F();
}
如果要访问uber属性,代码修改如下
function object(o) {
var n;
function F() {}
F.prototype = o;
n = new F();
n.uber = o;
return n;
}
使用这个方法和extendCopy()一样。
var triangle = object(twoDee);
triangle.name = 'Triangle';
triangle.getArea = function(){return this.side * this.height / 2;};
triangle.toString();// "shape, 2D shape, Triangle"
这个方法也是基于prototype的继承。因为把父对象作为子对象的prototype属性。
分享到:
相关推荐
在JavaScript中继承是一个非常复杂的话题,比其他任何面向对象的语言中的继承都复杂得多。在大多数其他面向对象语言中,继承一个类只需使用一个关键字即可。与它们不同,在JavaScript中要想达到传承公用成员的目的,...
Javascript继承机制原理 可以参考下
浅析Javascript原型继承,浅析Javascript原型继承
javascript控件开发之继承关系的源码
JavaScript继承与多继承实例分析.docx
javascript继承之为什么要继承.docx
javascript 继承派生等问题的资料,都是网上收集的,学会apply call 就懂js面向对象的原理了。
JavaScript继承机制研究.pdf
JavaScript继承的三种方法实例 继承 继承: 首先继承是一种关系,类(class)与类之间的关系,JS中没有类,但是可以通过构造函数模拟类,然后通过原型来实现继承。 继承也是为了数据共享,js中的继承也是为了实现...
理解Javascript原型继承原理
javascript 五种继承简介。
javascript原型继承,prototype的使用,可以像java一样继承
Javascript继承[参考].pdf
JavaScript Inheritance ...And you think you’re so clever ...JavaScript的原型继承比类继承有更强大的表现力,现在就让我们来看看。 Java JavaScript 强类型 弱类型 静态 动态 基于类 基于原型 类
JavaScript继承机制探讨及其应用.pdf
Javascript原型继承Javascript原型继承Javascript原型继承
浅析javascript原型继承机制,浅析javascript原型继承机制
我们还知道,面向对象编程有三个重要的概念 - 封装、继承和多态。 但是在JavaScript的世界中,所有的这一切特性似乎都不存在。 因为JavaScript本身不是面向对象的语言,而是基于对象的语言。
详解Javascript继承的实现_.docx
JavaScript面向对象编程中使用继承,详细讲解四种实现方法的原理。