You need to enable JavaScript to run this app. JavaScript函数式继承super方法示例:get_name带参数n疑问及运行报错排查
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript函数式继承super方法示例:get_name带参数n疑问及运行报错排查

对应问题解答

运行报错的原因

你碰到的Cannot set property 'name' of undefined报错,根本不是代码逻辑的问题,是你运行的示例片段缺了原书配套的前置依赖:

  • 代码里写的Object.method('superior', ...)不是JavaScript原生自带的方法,是Crockford在介绍函数式继承的章节里自定义的原型工具函数,原书对应的前置实现是:
    Object.method = function (name, func) {
        Object.prototype[name] = func;
        return this;
    };
    
  • 跳过这段前置定义直接运行后面的代码,因为Object本身没有method方法,自然会在调用时触发类型错误,补上这段代码就能正常运行。

关于重写的get_name里冗余参数n的解答

核心判断

这个括号里的n是完全没有实际作用的冗余写法,根本不是为了适配purr方法做的设计。

  • 单看这个重写后的get_name函数:函数体从头到尾没有引用过这个叫n的变量,连把它传给内部调用的super_get_name的步骤都没有,属于定义了但全程没用到的形参。
  • 再看它和purr方法的关系:purr方法里的n是用来控制生成呼噜字符串长度的循环边界值,是独立挂载在cat实例上的参数;get_name既没有在内部调用purr,也没有设计要把传入的参数传递给purr做内容拼接,两者完全是独立的方法,不存在任何设计层面的联动。

这段冗余代码的来源

这个细节是Crockford写示例时的写法惯性导致的:

  • 前面写cat构造器的时候,purr方法的形参就是n,编写coolcat的get_name方法时,很容易从前面的代码块复制片段,顺手写了带n的形参,写完也没删掉没用的部分。
  • JavaScript本身对函数形参的匹配非常宽松:就算你定义了函数根本用不到的形参,不管你给这个方法传不传、传什么值,都不会影响原有运行逻辑——你完全可以把这个多余的n删掉,代码运行结果没有任何区别,反而更简洁。

内容的提问来源于stack exchange,提问作者Jimmy Bionic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 18:45:02