function Test(name,age) {
this.name = name
this.age = age
//return {}
//return 123
//return null
}
Test.prototype.sayName = function (){
console.log(this.name)
}
let a = new Test("cj",18)
上面就是正常的一个new的操作,现在开始进行分析
new操作符就做了什么
- new操作首先以构造函数的原型对象为原型创建一个对象
- 将构造函数中的属性和方法添加到创建的对象身上(将构造函数内部的this指向创建的对象)
- 判断构造函数是否有返回值。没有返回值的情况下直接返回创建的对象。存在返回值的情况下,如果返回值是基本数据类型,那么还是返回我们创建的对象,如果是返回值是引用数据类型,就会将返回值返回出去。
实现new操作符
function myNew(Fn,paramas){
let obj = Object.create(Fn.prototype);
let res = Fn.apply(obj,paramas)//这里就相当于obj执行了一下Fn的构造函数,将Fn的属性和方法添加到obj上面,如果构造函数中有返回值,res就是这个返回值,否则就是undefined
console.log("res",res)
console.log("obj",obj)
return res instanceof Object ? res : obj
}
function Test(name,age) {
this.name = name
this.age = age
}
Test.prototype.sayName = function (){
console.log(this.name)
}
let a = myNew(Test,["cj",18])
console.log("A",a)
a.sayName()
以上就是实现new操作符,根据这个可能会问到,bind,call,apply的用法,区别,手写