conan1992 / blog

记录下知识点..
3 stars 0 forks source link

new模拟实现 #9

Open conan1992 opened 4 years ago

conan1992 commented 4 years ago

new原理

定义: new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象类型之一;

  • new的结果是生成一个对象
  • 生成的对象原型指向构造函数的原型
  • 构造函数里的this指向生成的对象

    初步实现

    
    function foo(){
    var obj = new Object();
    var constructor = Array.prototype.shift.call(arguments)//构造函数
    // 链接到原型,obj 可以访问到构造函数原型中的属性
obj.__proto__ = constructor.prototype;

    // 绑定 this 实现继承,obj 可以访问到构造函数中的属性
    constructor.apply(result, arguments);
return  obj;

}

### 思考
当构造函数有返回值时呢?
如果返回值是一个对象,我们就返回这个对象,如果没有,我们返回生成的对象。
最终版
```js
function foo(){
    var obj = new Object();
    var constructor = Array.prototype.shift.call(arguments)//构造函数

    obj.__proto__ = constructor.prototype;
    var result = constructor.apply(result, arguments);
    return result instanceof Object ? result : obj;
}