js中如何实现关键字new

196 阅读1分钟

1.首先在new一个实例时,做了什么?如下所示

1.访问了构造函数的属性,name,age 2.访问原型链的属性,say()

function Person(name,age){
    this.name = name;
    this.age = age;
    return 1
}
Person.prototype.say = function(){
    console.log("hello")
}
var p = new Person("zhao",18)
console.log(p.name)//zhao
console.log(p.age)//18
p.say()//hello

2.提出两个问题:

2.1如何让实例对象拥有父类构造函数的属性?

联想到构造函数的继承

function Person(){
    this.color= ["bule","green","red"];
    this.say = function (){
        console.log("nihao")
    }
};
function Stu(){
    Person.call(this)
}

2.2如何让实例对象拥有父类原型链的属性?

通过原型链来访问,即实例的__proto__指向构造函数的prototype

具体实现如下:

function myNew(father,...args){
    //1.实现原型链的指向
    var obj = Object.create(father.prototype)
    //2.实现构造函数中属性的访问
    var res = father.call(obj,...args)
    return typeof(res) == "object"? res:obj
}