js中new操作符
背景知识
__proto__和prototype区别
- prototype属性是一个静态属性,
- __proto__属性是一个实例属性。
- prototype表示类的原型对象,__proto__表示原型对象中定义的内部属性[prototype]的值。
- 类的每一个实例都有一个__proto__属性,用于引用创建它的构造方法的prototype属性,也就是该类的原型对象,即存在如下等式:(new Array(“abc”)).proto===Array.prototype (Array(“abc”)为Array的实例)
console.log(Object,Object.prototype)
let obj = new Object
console.log(obj)
console.log(Object.prototype === obj.__proto__)
new操作符可分为四步
- 创建空对象
- 将空对象的原型,指向构造函数的原型
- 改变this指向,将空对象作为构造函数的上下文
- 返回对象。返回值为基础数据类型时,则忽略返回值;当返回值为引用数据类型时,则使用retuen返回的值,new就失效了
手写new
function MyNew(fun, ...args) {
let obj = {}
obj.__proto__ = fun.prototype
let res = fun.apply(obj, args)
return res instanceof Object ? res : obj
}
function test(age, name) {
this.age = age
this.name = name
return 111
}
console.log(MyNew(test, 18, '李四'))
当构造函数返回引用数据类型时
function MyNew(fun, ...args) {
let obj = {}
obj.__proto__ = fun.prototype
let res = fun.apply(obj, args)
return res instanceof Object ? res : obj
}
function test(age, name) {
this.age = age
this.name = name
return [1,2,3]
}
console.log(MyNew(test, 18, '李四'))