Javascript:由 “鸭子类型” 得出来的推论
背景
学动态语言的都知道一句话:“如果它走起来像鸭子,而且叫起来像鸭子,那么它就是鸭子”,Javascript也支持鸭子类型,下文就说说鸭子类型在Javascript中的两个应用场景。
两个推论
- 凡是这样签名的方法:object.method(arg1, arg2, ...)的方法,都可以采用method.apply(object, [arg1, arg2, ...])进行调研。
- array的某些方法(不会修改array状态)可以使用arguments以Array.prototype.method.apply(arguments,[arg1, arg2, ...])的方式调用。
- 前者:把array当成arguments(鸭子)
- 后者:把argument当成array(鸭子)
一个小测试
Javascript中的惯用法
1 console.log(Math.max.apply(Math, [3, 2, 1])); 2 3 var arr = [1, 2, 3] 4 Array.prototype.push.apply(arr, [4, 5, 6]); 5 console.log(arr); 6 7 (function () { 8 var arr = Array.prototype.slice.apply(arguments); 9 console.log(arr); 10 })(1, 2, 3);
我们自己来模仿鸭子
1 var arr = Array.prototype.slice.apply({ 0: 1, 1: 2, 2: 3, length: 3 }); 2 console.log(arr);
备注
鸭子类型和隐式接口有那么一点点类似,它扩大了多态的概念。