concatenative inheritance同签名方法覆盖:如何打印WeatherData的value值
问题原因
Object.assign的参数顺序错误导致自定义toString方法被父类方法覆盖。Object.assign(target, ...sources)的规则是后传入对象的同名属性会覆盖前面的属性,你当前写法将父类_event作为第二个参数传入,直接覆盖了你在第一个参数中定义的WeatherData专属toString方法,最终调用的是Event的toString,自然没有value输出。
修复方案
调换Object.assign的参数顺序,将需要覆写的子类属性放在最后一个参数位置即可,另外建议在拼接_event.toString()前增加换行符优化排版,修改后的完整代码如下:
const Event = (time, place) => { var _time = time var _place = place return { getTime() { return _time }, getPlace() { return _place }, updateTime() { _time = new Date(Date.now()) }, toString() { return 'Time: ' + _time + '\nPlace: ' + _place } } } const WeatherData = (value, time, place) => { var _event = Event(time, place) var _value = value const getValue = () => { return _value } const toString = () => { return 'Value: ' + _value + '\n' + _event.toString() } // 调整参数顺序:空对象作为目标,先合并父类属性,再合并子类属性覆盖同名方法 return Object.assign({}, _event, { getValue, toString }) } const wd = WeatherData(10.1, new Date(Date.now()), 'Chisinau, Moldova') console.log(wd.toString())
运行输出示例
Value: 10.1 Time: Sat Sep 18 2021 08:49:10 GMT+0200 (Central European Summer Time) Place: Chisinau, Moldova
内容的提问来源于stack exchange,提问作者kakakakakakakk
相关产品推荐
相关产品推荐

