Object的create、assign、getPrototypeOf与拷贝

一. 深拷贝与浅拷贝与原型拷贝

浅拷贝:指向同一个内存地址

深拷贝:指向不同的内存地址

1.0 浅拷贝

function clone(obj) {
  return Object.assign({}, obj);

}

let obj2 = obj1;

1.1 深拷贝

1.1.1 JSON化

let bar = JSON.parse(JSON.stringify(foo));

1.1.2 递归函数

function deepClone(obj) {
    let newObj = obj.constructor === Array ? [] : {}
    for (let key in obj) {
        newObj[key] = typeOf obj[key] === 'object' ? deepClone(obj[key]) : obj[key]
    }
    return newObj
}

 

1.2 原型拷贝

<script>
            /* 创建包含原型链的实验对象obj1-- start */
            function inheritPrototype(subType, superType) {
                var prototype = Object(superType.prototype);
                prototype.constructor = subType;
                subType.prototype = prototype;
            }

            function SuperType(name) {
                this.name = name;
                this.colors = ['red', 'yellow', 'black'];
            }

            SuperType.prototype.sayName = function() {
                alert(this.name);
            }

            function SubType(name, age) {
                SuperType.call(this, name);
                this.age = age;
            }

            inheritPrototype(SubType, SuperType);

            SubType.prototype.sagAge = function() {
                alert(this.age);
            };

            var obj1 = new SubType('puppy', 12);
             /* 完成实验对象obj1的创建  --end */
            
            /* 原型拷贝-- start */
            var obj2 = Object.getPrototypeOf(obj1);
            var obj3 = Object.assign(Object.create(obj2), obj1);
            /* 原型拷贝-- end */

            console.log(obj1);
            console.log(obj2);
            console.log(obj3);
        </script>

 

function protoClone(obj) = {
    let protoObject = Object.getPrototypepf(obj);
    let newObj = Objet.assign(Object.create(protoObject), obj)
}
  • let protoObject = Object.getPrototypepf(obj);获得了obj的原型对象
  • Object.create(protoObject)创建了以原型对像为原型的对象
  • Objet.assign(Object.create(protoObject), obj)将obj的属性传递给newObj

二. Object.assign() create() defineProperty()

2.0 Object.getPrototypeOf(obj)

返回obj的原型对象

2.1 Object.create(protoType, propertiesObject)

第一个参数是新对象的原型对象

第二个参数是属性描述对象,属性key就是对象的key,属性的value的对象的value属性

2.2 Object.assign(targetObject, sourceObject)

assign实现的是伪深拷贝,对于普通的属性会深拷贝,但是对于对象中前套的对象就变成了普通的浅拷贝。

1. 拷贝可枚举的属性

2. 拷贝自由自有的属性,即原型属性不会继承

 

let foo = {
  a: 1,
  b: 2,
  c: {
        d: 1
  }
}
let bar = Object.assign({}, foo}
foo.a++; //foo.a === 2  bar.a ===1
foo.c.d++; //bar.c.d === 2;

 

 

 

 

 

 

参考资料:https://www.cnblogs.com/hity-tt/p/6797663.html

 

posted @ 2018-03-27 09:24  nina阿瑶  阅读(799)  评论(0编辑  收藏  举报