new 干了三件事:
1.创建空对象obj
2.将obj的__proto__指向构造函数的prototype
3.执行构造函数,继承构造函数中的变量、方法
Object.create()只干一件事:
将返回值的__proto__指向参数
如果参数传构造函数的prototype,则跟new的第二步一样
结论:
new 不但继承原型链中的方法、属性(第二步),还会继承构造函数中的方法、属性
Object.create()只做了第二步,所以只会继承原型链中的方法、属性。
验证:
function A(a,b) {
this.a =a
this.b =b
}
A.prototype.c='dddd'
let a = new A('111','2222')
let b = Object.create(A.prototype)
console.log(a);
console.log(b);
第一个用new构造的a 拥有构造函数上的属性、方法,也会继承原型链。
第二个用Object.create()构造的b 只会继承原型链上的属性、方法。
拓展:手写new
function myNew(fn,...args) {
// 1. 创建新对象
let obj = {}
// 2.新对象的__proto__指向fn的prototype
obj.__proto__=fn.prototype
// 3.执行构造函数来继承构造函数中的变量、对象
let res = fn.call(obj,...args)
return res instanceof Object ? res : obj
}