js 继承和深浅拷贝问题

继承

function A(){}
function B(){}

两个构造函数,让B继承A

  1. 直接通过 new A()
    B.prototype=new A();
    这种方式有一个弊端,会额外执行一次A的构造函数,增加开销,甚至可能会造成内存泄漏。
  2. 通过Object.create()
    B.prototype=Object.create(A.prototype)
    Object.create 是ES5中的方法
  3. 自己实现Object.create()
    function object(o){
    	functionF(){}
    	F.prototype=o;
    	return  new F();
    }
    B.prototype=object(A.prototype)  //对A原型的浅拷贝
    
    如果A原型对象中有引用类型的属性,那么A和B的所有实例都共享这个属性值。

这3种方法都是往B的原型对象中添加一个__proto__指向A

拷贝

  • 浅拷贝 语法
    只拷贝引用
    Object.assign()Object.create()配合可以实现继承多个对象
    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/create

  • 深拷贝

  obj1 = { a: 0 , b: { c: 0}};
  var obj3 = JSON.parse(JSON.stringify(obj1));
  obj1.a = 4;
  obj1.b.c = 4;
  console.log(JSON.stringify(obj3)); // { a: 0, b: { c: 0}}

Object.create()

参考:https://juejin.im/post/6844903589815517192
MDN上的定义:

Object.create(proto,[propertiesObject])
  • proto:新创建对象的原型对象
  • propertiesObject:可选。要添加到新对象的可枚举(新添加的属性是其自身的属性,而不是其原型链上的属性)的属性。

Object.create()、{…}的区别

var o = {a:1};
console.log(o)

控制台输出
从上图可以看到,新创建的对象继承了Object自身的方法,如hasOwnPropertytoString等,在新对象上可以直接使用。

再看看使用Object.create()创建对象:

var o = Object.create(null,{
    a:{
           writable:true,
        configurable:true,
        value:'1'
    }
})
console.log(o)

在这里插入图片描述
可以看到,新创建的对象除了自身属性a之外,原型链上没有任何属性,也就是没有继承Object的任何东西,此时如果我们调用o.toString()会报Uncaught TypeError的错误。
大家可能会注意到,第一个参数使用了null。也就是说将null设置成了新创建对象的原型,自然就不会有原型链上的属性。我们再把上面的例子改一改:

var o = Object.create({},{
    a:{
           writable:true,
        configurable:true,
        value:'1'
    }
})
console.log(o)

将null改为{},结果是怎样的?在chrome控制台打印如下:
在这里插入图片描述
我们看到,这样创建的对象和使用{}创建对象已经很相近了,但是还是有一点区别:多了一层proto嵌套。

我们最后再来改一下:

var o = Object.create(Object.prototype,{
    a:{
           writable:true,
        configurable:true,
        value:'1'
    }
})
console.log(o)

chrome控制台打印如下:
在这里插入图片描述
这次就和使用{}创建的对象一模一样了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值