如何实现一个 new

2019-10-16  本文已影响0人  三文治z

在调用 new 的过程中会发生以下四件事情:

1.新生成了一个对象
2.链接到原型
3.绑定 this
4.返回新对象

function create() {
  let obj = {}                       // 创建一个空对象
  let Con = [].shift.call(arguments) // 获取构造函数
  obj.__proto__ = Con.prototype      // 设置空对象的原型
  let result = Con.apply(obj, arguments)           // 绑定 this 并执行构造函数
  return result instanceof Object ? result : obj   // 确保返回值为对象
}

function Dog(name) {
    this.name = name
    this.say = function () {
       console.log('name = ' + this.name)
    }
}
const dog = create(Dog, 'aaa')
dog.say()  // name = aaa
console.log(dog instanceof Dog)  // true

补充 [].shift.call( arguments ) 和 [].slice.call( arguments )

1. [].shift.call( arguments )
[].slice.call( arguments )
// 等效于
Array.prototype.slice.call( arguments )
2. [].shift.call( arguments )
[].shift.call( arguments )
// 等效于
Array.prototype.shift.call( arguments )

shift() 方法删除数组第一项,并返回删除项。
根据上边的理解,这句代码意思就是: “删除并拿到 arguments 的第一项”

上一篇下一篇

猜你喜欢

热点阅读