请问JS中new 一个对象发生了什么

new一个实例
// es5
const Lijianhua = function () {
     
  this.lastname = 'li'
  this.firstname = 'jianhua'
}
Lijianhua.prototype.say = function () {
     
  console.log('hi')
}
const her = new Lijianhua()
her.say()
// es6 是es5的语法糖
class Lijianhua {
     
  constructor () {
     
    this.lastname = 'li'
    this.firstname = 'jianhua'
  }

  say () {
     
    console.log('hi')
  }
}
const her = new Lijianhua()
her.say()
new操作中发生了什么?

new 一个对象过程中,主要发生了以下步骤:

  1. 以构造器的prototype属性为原型,创造一个新的、空的对象
  2. 将它的引用赋给构造器的 this,同时将参数传到构造器中执行
  3. 如果构造器没有手动返回对象,则返回第一步创建的新对象,如果有,则舍弃掉第一步创建的新对象,返回手动return的对象。
实现一个new方法
class Lijianhua {
     
  constructor () {
     
    this.lastname = 'li'
    this.firstname = 'jianhua'
  }

  say () {
     
    console.log('hi')
  }
}

// 自己定义的new方法
const newMethod = function (Parent, ...rest) {
     
// 1.以构造器的prototype属性为原型,创建新对象;
  const child = Object.create(Parent.prototype)
  // 2.将this和调用参数传给构造器执行
  const result = Parent.apply(child, rest)
  // 3.如果构造器没有手动返回对象,则返回第一步的对象
  return typeof result === 'object' ? result : child
}
// 创建实例,将构造函数Parent与形参作为参数传入
const her = newMethod(Lijianhua)
her.say() // 'hi';
console.log(her instanceof Lijianhua) // true

参考:https://www.cnblogs.com/echolun/p/10903290.html

你可能感兴趣的:(JavaScript)