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

  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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,909评论 0 17
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,904评论 1 32
  • 1. 如图,我们有员工出生日期如左表,想要批量算出所有员工的年龄如右表。 2. 在表中黄色单元格内输入公式:=YE...
    lazyor阅读 10,514评论 0 4
  • 看到了一半,这章的内容有些颠覆我的认知,想起两年前做一个运动社交APP的公众平台搭建,为服务号还是订阅号纠结了几天...
    宋洁_8bc8阅读 1,189评论 0 0
  • 不知不觉进群成为正式会员已经20天了,每天看到群里姐妹们满满正能量的分享和讨论,自己工作忙,没功夫插嘴,也很少发表...
    何和_3b9d阅读 1,180评论 0 1

友情链接更多精彩内容