前言
通過call()、apply()和bind()方法,我們可輕易地借用其它對象的方法,而無須從這些對象中繼承它。
在JavaScript中借用方法
在JavaScript中,有時可以重用其它對象的函數或方法,而不一定非得是對象本身或原型上定義的。通過 call()、apply() 和 bind() 方法,我們可輕易地借用其它對象的方法,而無須繼承這些對象。這是專業 JavaScript 開發者常用的手段。
原型方法
在 JavaScript 中,除了不可更改的原始數據類型,如 string、number 和 boolean,幾乎所有的數據都是對象。Array 是一種適用于遍歷和轉換有序數列的對象,其原型上有 slice、join、push 和 pop 等好用的方法。
一個常用的例子是,當對象和數組都是列表類型的數據結構時,對象可以從數組“借用”方法。最常借用的方法是 Array.prototype.slice
。
function myFunc() { // error, arguments is an array like object, not a real array arguments.sort(); // "borrow" the Array method slice from its prototype, which takes an array like object (key:value) // and returns a real array var args = Array.prototype.slice.call(arguments); // args is now a real Array, so can use the sort() method from Array args.sort(); } myFunc('bananas', 'cherries', 'apples');
借用方法之所以可行,是因為 call 和 apply 方法允許在不同上下文中調用函數,這也是重用已有功能而不必繼承其它對象的好方法。實際上,數組在原型中定義了很多常用方法,比如 join 和 filter 也是:
// takes a string "abc" and produces "a|b|cArray.prototype.join.call('abc', '|'); // takes a string and removes all non vowelsArray.prototype.filter.call('abcdefghijk', function(val) { return ['a', 'e', 'i', 'o', 'u'].indexOf(val) !== -1;}).join('');
可以看出,不僅對象可以借用數組的方法,字符串也可以。但是因為泛型方法是在原型上定義的,每次想要借用方法時都必須使用 String.prototype
或 Array.prototype
。這樣寫很亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb