new 运算符实现细节

function Person(name) {
    this.name = name;
}
Person.prototype.getName = function() {
    return this.name
}
var a = new Psrson('sven')
console.log(a.name)  // 'sven'
console.log(a.getName())  //  'sven'
console.log(Object.getPrototypeOf(a) === Person.prototype)  // true
new 运算符实现细节_第1张图片
console.log(a)

由上面这个例子可以知道new在执行时做了哪些事情:

  • 创建一个新对象
  • 将传入的参数变为了新对象的属性,这是构造函数内部的具体实现决定的
  • 让新对象的原型指向构造函数的prototype属性(构造函数的prototype的constructor属性默认指向构造函数本身)
  • 返回一个对象
    所以根据上面这几条,我们可以模拟一下new的实现过程:
  function Person(name) {
    this.name = name;
  }

  Person.prototype.getName = function() {
    return this.name;
  }

  var objectFactory = function() {
    var obj = new Object(),
      Constructor = [].shift.call(arguments);
    obj.__proto__ = Constructor.prototype;
    var ret = Constructor.apply(obj, arguments);
    return typeof ret === 'object' ? ret : obj;
  }
  var a = objectFactory(Person, 'sven')

  console.log(a.name)
  console.log(a.getName())
  console.log(Object.getPrototypeOf(a) === Person.prototype)
new 运算符实现细节_第2张图片
console.log(a)

可以看出,上下两个并没有什么区别

你可能感兴趣的:(new 运算符实现细节)