前言
通過call()、apply()和bind()方法,我們可輕易地借用其它對(duì)象的方法,而無須從這些對(duì)象中繼承它。
在JavaScript中借用方法
在JavaScript中,有時(shí)可以重用其它對(duì)象的函數(shù)或方法,而不一定非得是對(duì)象本身或原型上定義的。通過 call()、apply() 和 bind() 方法,我們可輕易地借用其它對(duì)象的方法,而無須繼承這些對(duì)象。這是專業(yè) JavaScript 開發(fā)者常用的手段。
原型方法
在 JavaScript 中,除了不可更改的原始數(shù)據(jù)類型,如 string、number 和 boolean,幾乎所有的數(shù)據(jù)都是對(duì)象。Array 是一種適用于遍歷和轉(zhuǎn)換有序數(shù)列的對(duì)象,其原型上有 slice、join、push 和 pop 等好用的方法。
一個(gè)常用的例子是,當(dāng)對(duì)象和數(shù)組都是列表類型的數(shù)據(jù)結(jié)構(gòu)時(shí),對(duì)象可以從數(shù)組“借用”方法。最常借用的方法是 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');
借用方法之所以可行,是因?yàn)?call 和 apply 方法允許在不同上下文中調(diào)用函數(shù),這也是重用已有功能而不必繼承其它對(duì)象的好方法。實(shí)際上,數(shù)組在原型中定義了很多常用方法,比如 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('');
可以看出,不僅對(duì)象可以借用數(shù)組的方法,字符串也可以。但是因?yàn)榉盒头椒ㄊ窃谠蜕隙x的,每次想要借用方法時(shí)都必須使用 String.prototype
或 Array.prototype
。這樣寫很
主站蜘蛛池模板:
巴彦县|
海淀区|
新沂市|
阜阳市|
蓝田县|
江达县|
南部县|
白沙|
钦州市|
凤台县|
米林县|
嘉定区|
南阳市|
红原县|
吉木乃县|
永修县|
禹州市|
邹平县|
西峡县|
滁州市|
平遥县|
玉门市|
八宿县|
嘉定区|
青州市|
游戏|
和林格尔县|
浦城县|
张家口市|
安康市|
孙吴县|
巩义市|
西林县|
内丘县|
云霄县|
寻乌县|
苗栗县|
安丘市|
虞城县|
房山区|
大连市|