关于不用class实现继承的一点问题

来源:5-6 JS 原型本章相关的面试题

慕前端0455350

2020-07-11

以下是在教材上看到的一种名为寄生组合的继承方式

//返回一个以o为原型的对象
function object(o){
    function F(){}
    F.prototype = o;
    return new F();
}

function inheritPrototype(SubType, SuperType){
    //创建一个以SuperType的原型为原型的对象
    let prototype = object(SuperType.prototype);
    console.log(prototype);
    //用该对象取代SubType原有的原型
    prototype.constructor = SubType;
    SubType.prototype = prototype;
}

//测试
//定义父类
function SuperType(name){
    this.name = name;
    this.colors = ["red", "blue"];
}
SuperType.prototype.sayName = function(){
    console.log(this.name);
}
//定义子类
function SubType(name, age){
    SuperType.call(this, name);
	this.age = age;
}
//修改子类原型
inheritPrototype(SubType, SuperType);
//添加子类原型方法
SubType.prototype.sayAge = function(){
    console.log(this.age);
}

let instance = new SubType("Jack", 18);
console.log(instance.prototype);
console.log(instance.__proto__);
instance.sayName();

想问一下对于开头的object(o)方法,为什么不可以使用如下方式定义呢?返回的也是一个以o为原型的对象。

function object(o){
     let obj = new Object();
     obj.prototype = o;
     return obj;
}

我自己调试的结果是,如果按照教材方式,在object()函数中通过F()构造函数新建实例,那么通过new SubType()创建的对象instance的原型,就和老师说的一样,必须用__proto__才可访问,对父类型SuperType的方法可以正常继承。
但如果在object()函数中是直接用Object创建,那么通过new SubType()创建的对象instance的原型,是可以直接用prototype显式访问到的,且就是SuperType。但是父类型SuperType的方法sayName并没有被继承,instance.sayName()会报错sayName不是一个函数。为什么会有这种差别呢?

写回答

1回答

双越

2020-07-12

恕我直言:ES6 都快一统天下了,为啥不用 class 实现继承呢?

前端和 js 的资料很多,网上更是混杂,得筛着看,都看是看不过过来的。

1
0

一天时间高效准备前端技术一面 匹配大厂面试要求

针对时下面试高频考点,帮助新人js面试快速通关

4694 学习 · 1681 问题

查看课程