背景
學動態語言的都知道一句話:“如果它走起來像鴨子,而且叫起來像鴨子,那么它就是鴨子”,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);
備注
鴨子類型和隱式接口有那么一點點類似,它擴大了多態的概念。