js 实现new操作符以及继承

js 实现new操作符

new 干了啥?

来自MDN:
new 关键字会进行如下的操作:

  1. 创建一个空的简单JavaScript对象(即{});
  2. 链接该对象(设置该对象的constructor)到另一个对象 ;
  3. 将步骤1新创建的对象作为this的上下文 ;
  4. 如果该函数没有返回对象,则返回this。
function CustomNew(fn) {
    
    
    const obj = {
    
    }; //1
    obj.__proto__ = fn.prototype;//2
    const result = fn.call(obj, ...arguments);//3
    if (typeof result === "object") {
    
    //4
        return result;
    } else {
    
    
        return obj;
    }
}

其中,prototype是函数独有的属性。
函数.prototype.constructor = 函数
实例对象的原型就是函数的原型对象:obj.proto = fn.prototype

继承

既然已经实现了new,那对于es6的特性class的继承,也应该实现以下。

function Animal (weight) {
    
    
	this.weight = weight;
	...//
}
Animal.prototype.sleep = function(){
    
    }

function Dog(weight,food){
    
    
	Animal.call(this,weight);//传入子类实例的this,获取到对应的属性
	this.food = food;
}
Dog.prototype.eat = function(){
    
    
	console.log(`吃${
      
      this.food}`);
}
Object.setPrototypeOf(Dog.prototype,Animal.prototype)//等价于Dog.prototype.__proto__ = Animal.prototype
const dog = new Dog(20,'骨头')

猜你喜欢

转载自blog.csdn.net/XIAOLONGJUANFENG/article/details/112913600