JS 实现new 关键字

首先要清楚类和对象之间的关系,然后要清楚实例化(new)的过程中发生了什么。

笔者认为类和对象的关系比较好理解,就如同要按照图纸盖一幢房子,图纸就是类,房子就是对象。类是对象的抽象,对象是类的实体体现。

new的过程发生了什么呢?

var Person=function(name,age){
    this.name=name;
    this.age=age;
}
Person.prototype.getName=function(){
    return this.name;
}
var p1=new Person('Tom',12)
p1.getName()    //Tom

有上面的例子可知,new的过程中创建了一个对象,根据构造函数的结构,原型,及方法等全部赋给这个对象,最后返回这个对象。

实现代码如下:

function New(fn){
    var res = {};
    if(fn.prototype !== null) {
        res.__proto__=fn.prototype;
    }
    // 将传入构造函数的参数,在res上下文中执行一遍
    var ret = fn.apply(res,Array.prototype.slice.call(arguments,1));
    // 如果构造函数返回一个对象,则直接返回这个对象 
    if((typeof ret === 'object' || typeof ret === 'function') && ret !== null){
        return ret;
    }
    return res;
}
var Person = function(name,age){
    this.name=name;
    this.age=age;
}
Person.prototype.getName=function(){
    return this.name;
}
var p1=New(Person,'Tom',12)
console.log(p1.getName())//Tom

 

posted @ 2019-06-10 20:45  mingL  阅读(1115)  评论(0编辑  收藏  举报