老师,setPrototypeOf是最好的解决方法吗
来源:5-20 【TS继承源码】逐行深剖,手写TS继承JS源码-2

目訫
2022-03-15
function PeopleNew (name, sex, age) { this.name = name this.sex = sex this.age = age } PeopleNew.prototype.info = function () { console.log(`${this.name},性别:${this.sex},现年${this.age}`) } function ChinesePeopleNew (name, sex, age, national) { PeopleNew.call(this, name, sex, age) this.national = national } ChinesePeopleNew.prototype.getHuKou = function () { console.log('getHuKou') } function __extends (son, parent) { function MiddleNew () { this.constructor = son } MiddleNew.prototype = parent.prototype return new MiddleNew() } ChinesePeopleNew.prototype = __extends(ChinesePeopleNew, PeopleNew)
上面的代码是最开始实现寄生组合式的代码,也是改变了子构造函数的原型对象空间指向,导致其方法失效
function PeopleNew (name, sex, age) { this.name = name this.sex = sex this.age = age } PeopleNew.prototype.info = function () { console.log(`${this.name},性别:${this.sex},现年${this.age}`) } function ChinesePeopleNew (name, sex, age, national) { PeopleNew.call(this, name, sex, age) this.national = national } ChinesePeopleNew.prototype.getHuKou = function () { console.log('getHuKou') } function __extends (son, parent) { function MiddleNew () { this.constructor = son } MiddleNew.prototype = son.prototype MiddleNew.prototype.__proto__ = parent.prototype return new MiddleNew() } ChinesePeopleNew.prototype = __extends(ChinesePeopleNew, PeopleNew)
其实稍加改动之后,也可以满足在原型对象空间上如果找不到该方法,就可以在原型对象空间的原型对象空间中找到该方法,实现继承的效果
那是不是说,其实每种方法都一样可以解决这个问题
那么是不是说其实只要子构造函数的原型链存在某一个构造函数的方法,就是继承了这个构造函数,也就是可以解释成和用什么方法加上去的无关
写回答
2回答
-
这里有个容易被忽视的问题,如果建立符合 OOP的继承,不应该用setPrototypeOf方法,因为
class ChinesePeople extends People {// OOP继承规定:继承建立之后再定义的子类方法才可以被之后创建的子类对象调用。 继承之前定义的方法应该失效或只能被继承之前的对象调用【那时还不叫子类对象,和继承无关】,
而实际上 这也符合继承要求,子类方法的定义发生在子类产生之后,保证代码的高内聚性!
study(){
} ‘
}
012022-03-17 -
jonben
2022-03-16
这样也行,其实跟setPrototypeOf是一个道理,都是改变其原型链的__proto__
012022-03-17
相似问题