JavaScript 中new运算符

一、new的作用

new 是一个语法糖,主要的作用是创建构造函数的实例

二、new一个实例的过程

function Person(name, age) {  
  this.name = name;  
  this.age = age;   
}  
var person = new Person("Alice", 23); 
复制代码
// 1. 创建一个空对象
let obj = new Object(); 
// 2. 让Person中的this指向obj,并执行Person的函数体
let result = Person.call(obj);  
// 3. 设置原型链,将obj的__proto__成员指向了Person函数对象的prototype成员对象
obj.__proto__ = Person.prototype;
// 4. 判断Person的返回值类型,如果是值类型,返回obj。如果是引用类型,就返回这个引用类型的对象
if (typeof(result) == "object")
{
  person = result;  
}
else{
  person = obj;
}
复制代码

三、手动实现new操作符

const objectFactory = function(){
    // 创建一个空对象
    let obj = {}; 
    // 获取构造函数
    let Constructor = [].shift.call(arguments);
    // 将构造函数的原型对象,作为新对象的原型对象
    obj.__proto__ = Constructor.prototype;
    // 绑定this,让this指向新的对象
    let result = Constructor.call(obj,...arguments)
    // 确保 使用new返回的是一个 object 对像
    return typeof result === "object" ? result : obj;
}
function Person(name, age) {  
    this.name = name;  
    this.age = age;   
}  
let p = objectFactory(Person,'hzy',2)
console.log(p)	// Person {name: 'hzy', age: 2}
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享