用js的方法实现一个new

new 运算符建立一个用户定义的对象类型的实例或具备构造函数的内置对象的实例。new 关键字会进行以下的操做:app

1.建立一个空的简单JavaScript对象(即{});
2.连接该对象(即设置该对象的构造函数)到另外一个对象 ;
3.将步骤1新建立的对象做为this的上下文 ;
4.若是该函数没有返回对象,则返回this。函数

window.name = "iii"

function Person(){
    this.name = 3
}
Person.prototype.say = function(){
    console.log(this.name)
}
var p1 = new Person();
p1.say() //3
function _new(P){
    let o = {}; //1.新建对象
        let arg = Array.prototype.slice.call(arguments,1);
        o.__proto__ = P.prototype; //2.连接对象
       // P.prototype.constructor = P;
        P.apply(o,arg);//3.设置this指向obj(原来指向window)//执行一次构造函数
        return o;//4.返回对象
}
var p2 = _new(Person)
p2.say() //3

console.log(p2 instanceof Person ) //true
console.log(p2.construtor === p1.construtor) //true

当代码 new Foo(...) 执行时,会发生如下事情:this

一个继承自 Foo.prototype 的新对象被建立。
使用指定的参数调用构造函数 Foo,并将 this 绑定到新建立的对象。new Foo 等同于 new Foo(),也就是没有指定参数列表,Foo 不带任何参数调用的状况。
由构造函数返回的对象就是 new 表达式的结果。若是构造函数没有显式返回一个对象,则使用步骤1建立的对象。(通常状况下,构造函数不返回值,可是用户能够选择主动返回对象,来覆盖正常的对象建立步骤)prototype

相关文章
相关标签/搜索