一个例子 - 看懂JS中new关键字的实现原理

2019-08-21  本文已影响0人  Jason_Zeng
  1. new的实现代码如下:
// new的实现
function NewFn(fn) {
    // 判断是否有原型对象,并当作new的原型对象
    let proto = Object(fn.prototype) === fn.prototype ? fn.prototype : Object.prototype;
    // 利用原型创建new的对象
    let obj = Object.create(proto);
    // 把obj当作fn的this调用, 并解析去除fn在arguments里面的位置,剩余的传进去
    let res = fn.apply(obj, Array.prototype.slice.call(arguments, 1));
    // 判断返回的是否是对象
    if (Object(res) === res) { 
        // 是对象则返回经过fn处理过的res
        return res;
    }
    // 不是对象返回obj
    return obj;
}
  1. 测试用例如下
// 构造函数
function Foo(name) {
    this.name= name;
    this.go = function() {
        console.log(this.name +  " go");
    }
}
Foo.prototype.base = "mother";

// 测试用例
var foo = NewFn(Foo, "jason");
console.log(foo.name);
console.log(foo.base);
foo.go();
console.log(foo instanceof Foo);
  1. 输出结果
jason
mother
jason go
true
上一篇 下一篇

猜你喜欢

热点阅读