new 操作符的作用
實(shí)例化出一個(gè)新的對(duì)象,并將新對(duì)象的原型對(duì)象指向
當(dāng)前構(gòu)造函數(shù)的原型
或者Object.prototype
新對(duì)象的原型對(duì)象指向當(dāng)前構(gòu)造函數(shù)的原型
function Person(name, age) {
this.name = name
this.age = age
}
const p1 = new Person('Tom', 23)
新對(duì)象的原型對(duì)象指向 Object.prototype
function Person(name, age) {
this.name = name
this.age = age
return { name, age }
}
const p1 = new Person('Tom', 23)
當(dāng)返回值不是 Object 實(shí)例的時(shí)候自動(dòng)忽略
function Person(name, age) {
this.name = name
this.age = age
return 2
}
const p1 = new Person('Tom', 23)
new 操作符的實(shí)現(xiàn)思路
- 創(chuàng)建一個(gè)新的對(duì)象
- 添加屬性
- 指定原型對(duì)象
- 如果構(gòu)造函數(shù)沒有返回對(duì)象浮庐,就返回新建的對(duì)象
function myNew(target) {
// 新建一個(gè)對(duì)象
const obj = Object.create({})
// 添加屬性
const result = target.apply(obj, Array.prototype.slice.call(arguments, 1))
// 指定原型對(duì)象
Object.setPrototypeOf(obj, target.prototype)
// or
// obj.__proto__ = target.prototype
// 如果構(gòu)造函數(shù)沒有返回對(duì)象弹惦,就返回新建的對(duì)象
return result instanceof Object ? result : obj
}
const p2 = myNew(Person, 'Skill', 23)
為什么不使用 obj.proto = Object.create(target.prototype) 綁定原型對(duì)象
先看下使用 obj.proto = Object.create(target.prototype) 綁定原型對(duì)象的結(jié)果
function myNew(target) {
// 新建一個(gè)對(duì)象
const obj = Object.create({})
// 添加屬性
const result = target.apply(obj, Array.prototype.slice.call(arguments, 1))
// 指定原型對(duì)象
obj.__proto__ = Object.create(target.prototype)
// 如果構(gòu)造函數(shù)沒有返回對(duì)象,就返回新建的對(duì)象
return result instanceof Object ? result : obj
}
const p2 = myNew(Person, 'Skill', 23)
多了一層的原因是因?yàn)?Object.create(target) 是基于目標(biāo)對(duì)象(target)創(chuàng)建出一個(gè)實(shí)例
【筆記不易喉恋,如對(duì)您有幫助沃饶,請(qǐng)點(diǎn)贊,謝謝】