js对象深潜拷贝(从requirejs中抠出来的)

 1 var op = Object.prototype,
 2     ostring = op.toString,
 3     hasOwn = op.hasOwnProperty;
 4
 5 function isFunction(it) {
 6     return ostring.call(it) === ‘[object Function]‘;
 7 };
 8
 9 function isArray(it) {
10     return ostring.call(it) === ‘[object Array]‘;
11 };
12 function hasProp(obj, prop) {
13     return hasOwn.call(obj, prop);
14 };
15 function eachProp(obj, func) {
16     var prop;
17     for (prop in obj) {
18         if (hasProp(obj, prop)) {
19             if (func(obj[prop], prop)) {
20                 break;
21             }
22         }
23     }
24 };
25 /**
26  * Simple function to mix in properties from source into target,
27  * but only if target does not already have a property of the same name.
28  *
29  * @param {target} 目标对象
30  * @param {source} 源对象
31  * @param {force} 是否强制覆盖目标对象已有的属性
32  * @param {deepStringMixin} 是否深拷贝递归操作
33  *
34  * @returns {target}
35  */
36 function mixin(target, source, force, deepStringMixin) {
37     if (source) {
38         eachProp(source, function (value, prop) {
39             if (force || !hasProp(target, prop)) {
40                 if (deepStringMixin && typeof value === ‘object‘ && value &&
41                     !isArray(value) && !isFunction(value) &&
42                     !(value instanceof RegExp)) {
43
44                     if (!target[prop]) {
45                         target[prop] = {};
46                     }
47                     mixin(target[prop], value, force, deepStringMixin);
48                 } else {
49                     target[prop] = value;
50                 }
51             }
52         });
53     }
54     return target;
55 };
56
57
58 调用:
59 var obj = {
60     name:‘Tom‘,
61     age:19,
62     children:{
63         name:‘Jack‘,
64         age:30
65     }
66 };
67 var obj2 = mixin({},obj,false,true);
68 obj.children.name=‘Marry‘;
69 console.log(obj2);
时间: 2024-10-13 22:06:07

js对象深潜拷贝(从requirejs中抠出来的)的相关文章

js 对象深复制,创建对象和继承

js 对象深复制,创建对象和继承.主要参考高级编程第三版,总结网上部分资料和自己的代码测试心得.每走一小步,就做一个小结. 1.对象/数组深复制 一般的=号传递的都是对象/数组的引用,如在控制台输入 var a=[1,2,3], b=a; b[0]=0; a[0] 此时显示的结果为0,也就是说a和b指向的是同一个数组,只是名字不一样罢了. 单层深复制: 1.js的slice函数: 返回一个新的数组,包含下标从 start 到 end (不包括该元素,此参数可选)的元素. 控制台输入: var a

利用js对象的特性,去掉数组中的重复项

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Unt

实现JS对象深复制的简单方案

前段时间开jQuery源代码的时候,正好看到jQuery.extend的实现方案,忽然想到对象的深复制和浅表复制的问题. 因为引用类型对象的存在,所以简单的使用"="只能实现引用关系的复制,所以当其中一个引用指向的变量发生变化的时候,相应的另外一个引用也会发生变化. 所以很多时候也称这种复制为浅表复制.那么如何才能实现对象的深复制呢?以下是实现深复制的简单实现代码,仅供参考. 1 function copyObject(target){ 2 return _copy(target);

js对象常用2中构造方法

//js 对象的构造方法通常有2中情况: //第一种是通过json对象构造 var persion={ name:"孙悟空", age:40, eat:function () { alert("我饿了"); } }; persion.eat(); // 第二种是通过函数的方式构造,即函数原型链(prototype)的方式构造 function Persion() {} Persion.prototype={ name:"猪八戒", age:30,

js对象拷贝

在JS中,一般的=号传递的都是对象/数组的引用,并没有真正地拷贝一个对象,那如何进行对象的深度拷贝呢?如果你对此也有疑问,这篇文章或许能够帮助到你 一.对象引用.浅层拷贝与深层拷贝的区别 js的对象引用传递理解起来很简单,参考如下代码: var a = {name:'wanger'} var b = a ; a===b // true b.name = 'zhangsan' a.name //'zhangan' 上述代码中,使用了=进行赋值,于是b指向了a所指向的栈的对象,也就是a与b指向了同一

JSON(二)——JavaScript中js对象与JSON格式字符串的相互转换

首先我们来看一下js中JSON格式的字符串 var JSONStr1 = "{\"name\" : \"张三\"}"; 注意以下的写法不是js中JSON格式的字符串,它只是一个js的字符串. var JSONStr2 = "{'name' : '张三'}"; 我们看JSON语法中对于字符串的定义:是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义.一个字符(character)即一个单独的字符串(characte

Objective-C:OC内部可变对象和不可变对象的深(复制)拷贝问题思考:

OC内部:可变对象和不可变对象的深(复制)拷贝问题思考: 不可变对象: 例如NSString对象,因为NSString对象是常量字符串,所以,不可以更改其内容,但是可以修改指向该字符串的指针指向.当对NSString对象做深拷贝时,如果是copy复制方式,其实就是浅复制,只是复制了同一个对象的指针:如果是mutableCopy复制方式,系统会分配一个新的内存空间用来存放复制出来的NSMutableString对象,此时地址是新的,内容是一样的,他们正在被不同的实例变量字符串指针指着. 可变对象:

JS对象中的原型

对象的原型:每个对象都连接一个原型对象,并且它可以从中继承属性.所有通过对象字面量创建的对象都连接到object.prototype.当你创建一个新对象时,你可以选择某个对象作为它的原型.原型连接在更新时不起作用.当我们对某个对象作出改变时,不会触及该对象的原型.原型连接只有在检索值的时候才被用到.如果我们尝试去获取对象的某个属性值,但该对象没有此属性名,那么JS会试着从原型对象中获取属性值,如果那个原型对象也没有该属性,那么再从它的原型中找,以此类推,直到该过程最后到达终点Object.pro

js中__proto__, property, prototype, 对象自身属性方法和原型中的属性方法的区别

__proto__: 这个属性是实例对象的属性,每个实例对象都有一个__proto__属性,这个属性指向实例化该实例的构造函数的原型对象(prototype). proterty:这个方法是对象的属性.(据说和一个对象的attr类似,比如dom对象中) prototype:每个构造函数都有一个prototype对象,这个对象指向该构造函数的原型. 对象自身属性方法和原型中的属性方法的区别: 对象自身的属性和方法只对该对象有效,而原型链中的属性方法对所有实例有效. 例子: function bas