You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 04:51:02