實(shí)現(xiàn)目標(biāo):
- 創(chuàng)建新的對象
- 新對象屬性有構(gòu)造函數(shù)中
this
綁定的屬性 - 新對象可以訪問構(gòu)造函數(shù)原型鏈上的屬性和方法
- 如果構(gòu)造函數(shù)返回了一個(gè)對象,實(shí)例化的對象只能訪問返回的對象中的屬性
let newF = function(Constructor, ...rest) {
const obj = Object.create(Constructor.prototype)
const res = Constructor.apply(obj, rest)
// && 當(dāng)結(jié)果為真時(shí)汗唱,返回第二個(gè)為真的值, 當(dāng)結(jié)果為假時(shí)碘勉,返回第一個(gè)為假的值
return (typeof res === 'object' && res) || obj
}
測試:
function Obj(name) {
this.name = name
}
Obj.prototype.setName = function(name) {
this.name = name
}
Obj.prototype.getName = function() {
return this.name
}
var obj1 = new Obj('huahua')
console.log(obj1)
console.log(obj1.getName())
obj1.setName('liul')
console.log(obj1.getName())
var obj2 = newF(Obj, 'huahua2')
console.log(obj2)
console.log(obj2.getName())
obj2.setName('liul2')
console.log(obj2.getName())
帶返回值的情況:
function Obj(name) {
this.name = name
return {
name: 'mod'
}
}
var obj2 = newF(Obj, 'huahua2')
console.log(obj2) // { name: 'mod' }
console.log(obj2.getName()) // TypeError: obj2.getName is not a function