zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    deepin15.7挂载/home到单独的分区:
    Docker配置整理
    Docker安装方法整理
    在ArangoDB中实现connectedcomponents算法
    Blazor入手教程(十一)使用组件库AntDesign Blazor
    Blazor入手教程(十)部署安装
    Blazor入手教程(九)c#和js互相调用
    Blazor入手教程(八)布局Layout
    Blazor入手教程(七)表单
    Blazor入手教程(六)组件的生命周期
  • 原文地址:https://www.cnblogs.com/ninalei/p/8655567.html
Copyright © 2011-2022 走看看