这里const result = obj.apply(newObj,reset)不知道为什么要有这一步。
我的理解是第一步把建立出来新对象的proto = 构造函数的prototype,那此时构造函数的实例newObj不就应该有构造函数中的所有属性与方法了吗,求解释,感谢各位
//自己理解的写法
function myNew(obj,...reset) {
let newObj = Object.create(obj.prototype);
return newObj
}
function Person(name) {
this.name = name;
this.say = function () {
console.log('我是person构造函数的say方法'+name)
}
}
let tempObj = myNew(Person);
console.log(tempObj)
tempObj.say() //打印出来is not a function
//正确写法
function myNew(obj,...reset) {
let newObj = Object.create(obj.prototype);
const result = obj.apply(newObj,reset);
return result === Object ? result : newObj;
}
这样可能好理解一点, 一步一步来:
1.
function Person
本身只是1个普通的函数,因为我可以像下面这样直接调用对吧:这样一来,这个函数只是改变了全局作用域上的name和say而已。
2.当你执行
new Person(name)
的时候,却是不一样的效果:那么这个new操作到底干了什么呢?
1.创建构造函数,任何使用new操作符的函数都会创建1个新的构造函数。
2.创建构造函数的过程中,虽然你直接使用
this.name = xxx
赋值了,但实际上隐性的创建了一个新的对象new Object()
。所以this
的属性都是挂载在这个新的对象上的。知道了
new
的操作会执行一遍创建对象即new Obejct
的操作,然后再执行一遍给这个对象赋值的操作即this.name = xxx
。你就能理解,其实new
是进行了两个操作,一是创建新对象,二是给这个对象的属性进行赋值。结论:
1.所以你的
Object.crate
操作只是完成了第一步,创建了1个新的对象,但是并没有执行给对象添加属性这一步。因为即使你是创建的Object.create(Person.prototype)
,也只是继承了Person
方法而已,但是本身Person
就没有被new
过啊,也就并没有创建新的对象,而且没有指定这个对象的this
是指向谁,没有赋值。所以你继承的只是一个空壳函数的呢。2.而
apply
方法会绑定作用域,即this
指向。同时执行这个函数,也就是执行this.name = xxx
赋值的操作。所以当你执行了apply
操作后,才算是给了这个对象一个完整的生命。