继承
function A(){}
function B(){}
两个构造函数,让B继承A
- 直接通过 new A()
B.prototype=new A();
这种方式有一个弊端,会额外执行一次A的构造函数,增加开销,甚至可能会造成内存泄漏。 - 通过
Object.create()
B.prototype=Object.create(A.prototype)
Object.create
是ES5中的方法 - 自己实现
Object.create()
如果A原型对象中有引用类型的属性,那么A和B的所有实例都共享这个属性值。function object(o){ functionF(){} F.prototype=o; return new F(); } B.prototype=object(A.prototype) //对A原型的浅拷贝
这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
自身的方法,如hasOwnProperty
、toString
等,在新对象上可以直接使用。
再看看使用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控制台打印如下:
这次就和使用{}创建的对象一模一样了。