JavaScript 构造函数

152 阅读1分钟

通过new关键字调用的函数就是构造函数,构造函数首字母建议大写

1.构造函数和普通函数的区别

首先我们知道构造函数也是可以当普通函数一样调用的,那么它们之间有什么区别呢?

function Person(name){  
    this.name = name
    return name
}
const q = Person('普通调用')
const w = new Person('构造调用')
console.log(q,w);
// 普通调用
// Person { name: '构造调用' }

构造函数把 Person 当作一个类,把创造的实例对象返回了出去。 new 做了什么:

  1. 创建一个空对象
  2. 该对象的隐式原型属性会指向构造函数的原型对象
  3. 声明this,这个新对象的this会绑定到函数调用的this
  4. 返回创建的空对象
function Person(name){
  this.name = name
}
Person.prototype.greeting = function (){
  console.log(this.name)
}
const wang = new Person('wang')
wang.greeting()
console.log(wang)
function _new(fn, ...rest){
  // 基于构造函数的原型创建新的对象
  let obj = Object.create(fn.prototype)
  // 将构造函数的 this 指向新对象并执行构造函数
  fn.apply(obj,rest)
  return obj
}
const z = _new(Person,'z')
z.greeting()
console.log(z)