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
相关产品推荐
相关产品推荐

