new操作符的作用?
了解new的作用?
function Fn1(name) {
this.name = name
}
Fn1.prototype.Fn2 = function () {
console.log(this.name);
}
let test = new Fn1('zhan')
console.log(test); //打印结果 Fn1 {name: 'zhan'}
console.log(test.name); //打印结果 zhan
test.Fn2() //打印结果 zhan
通过上述代码可以得出:
new 通过构造函数 fn1 创建出来的实例可以访问到构造函数中的属性
new 通过构造函数 fn1 创建出来的实例可以访问到构造函数原型链中的属性(即 fn2)
构造函数 fn1 的 this 指向是 new 通过构造函数 fn1 创建出来的实例
new操作符的实现步骤?
- 创建一个空的简单 JavaScript 对象(即
{}); - 为创建的空对象添加属性
__proto__,将该属性链接至构造函数的原型对象; - 将构造函数中的this绑定到新建对象
- 返回该对象,如果该函数没有返回对象,则返回
this。
自己实现一个new操作符
Object.setPrototypeOf() 方法设置一个指定的对象的原型(即,内部 [[Prototype]] 属性)到另一个对象或 null。
apply() 方法调用一个具有给定 this 值的函数,以及以一个数组(或一个类数组对象)的形式提供的参数。
// 封装一个函数
function newCreate(functionName, ...rest) {
let obj = {} //声明一个空得对象
// obj 对象需要访问到构造函数原型链上的属性,所以我们通过 setPrototypeOf 将两者联系起来。这段代码等同于 obj.__proto__ = functionName.prototype
Object.setPrototypeOf(obj, functionName.prototype)
let returnValue = functionName.apply(obj, rest)
// return 出去的时候判断
return returnValue instanceof Object ? returnValue : obj
}
总结:
记住重要得步骤就行!!
- 创建一个空的简单 JavaScript 对象(即
{}); - 为创建的空对象添加属性
__proto__,将该属性链接至构造函数的原型对象; - 将构造函数中的this绑定到新建对象
- 返回该对象如果该函数没有返回对象,则返回
this。
注意:如果你没有使用new运算符,构造函数会像其他的常规函数一样被调用,并不会创建一个对象。这种情况下this的指向也不一样。