摘要:基于函數(shù)進(jìn)行調(diào)用的,用來確保函數(shù)是在指定的值所在的上下文中調(diào)用的。添加私有函數(shù)目前上面為類庫(kù)添加的屬性都是公開的,可以被隨時(shí)修改。以基于的富應(yīng)用開發(fā)為主要學(xué)習(xí)資料。
控制“類”庫(kù)的作用域
在類和實(shí)例中都添加proxy函數(shù),可以在事件處理程序之外處理函數(shù)的時(shí)候保持類的作用域。下面是不用proxy的辦法:
var Class = function(parent){ var klass = function(){ this.init.apply(this, arguments); }; klass.prototype.init = function(){}; klass.fn = klass.prototype; // 添加一個(gè)proxy 函數(shù) klass.proxy = function(func){ var self = this; return(function(){ return func.apply(self, arguments); }); } // 在實(shí)例中也添加這個(gè)函數(shù) klass.fn.proxy = klass.proxy; return klass; };
下面是用proxy()函數(shù)來包裝函數(shù),以確保它們?cè)谡_的作用域中被調(diào)用:
var Button = new Class; Button.include({ init: function(element){ this.element = jQuery(element); // 代理了這個(gè)click 函數(shù) this.element.click(this.proxy(this.click)); }, click: function(){ /* ... */ } });
如果沒有使用proxy將click()的回調(diào)包裝起來,它就會(huì)基于上下文this.element來調(diào)用,而不是Button,這會(huì)造成各種問題。在新版本的JavaScript——ECMAScript 5(ES5)——中同樣加入了bind()函數(shù)用以控制調(diào)用的作用域。bind()基于函數(shù)進(jìn)行調(diào)用的,用來確保函數(shù)是在指定的this值所在的上下文中調(diào)用的。例如:
Button.include({ init: function(element){ this.element = jQuery(element); // 綁定這個(gè)click 函數(shù) this.element.click(this.click.bind(this)); }, click: function(){ /* ... */ } });
這個(gè)例子和proxy()函數(shù)是等價(jià)的,它能確保click() 函數(shù)基于正確的上下文進(jìn)行調(diào)用。老版本的瀏覽器不支持bind(),但可以手動(dòng)實(shí)現(xiàn)它,兼容性也不錯(cuò),直接擴(kuò)展相關(guān)對(duì)象的原型,這樣就可以像在ES5 中使用bind(),在任意瀏覽器中調(diào)用它。下面是一段實(shí)現(xiàn)了bind() 函數(shù)的代碼:
if (!Function.prototype.bind) { Function.prototype.bind = function (obj) { var slice = [].slice, args = slice.call(arguments, 1), self = this, nop = function () {}, bound = function () { return self.apply( this instanceof nop ? this : (obj || {}), args.concat(slice.call(arguments))); }; nop.prototype = self.prototype; bound.prototype = new nop(); return bound; }; }
如果瀏覽器原生不支持bind(),則僅僅重寫了Function 的原型。現(xiàn)代瀏覽器則可以繼續(xù)使用內(nèi)置的實(shí)現(xiàn)。
對(duì)于數(shù)組來說這種“打補(bǔ)丁”式的做法非常有用,因?yàn)樵谛掳姹镜腏avaScript 中,數(shù)組增加了很多新的特性。可以使用es5-shi項(xiàng)目,它涵蓋了ES5 中新增的盡可能多的特性。
添加私有函數(shù)目前上面為“類”庫(kù)添加的屬性都是“公開的”,可以被隨時(shí)修改。關(guān)于給“類”添加私有屬性,JavaScript支持不可變屬性,但在主流瀏覽器中并未實(shí)現(xiàn),沒辦法直接利用這個(gè)特性。可以利用JavaScript 匿名函數(shù)來創(chuàng)建私有作用域,這些私有作用域只能在內(nèi)部訪問:
var Person = function(){}; (function(){ var findById = function(){ /* ... */ }; Person.find = function(id){ if (typeof id == "integer") return findById(id); }; })();
上面的代碼將類的屬性都包裝進(jìn)一個(gè)匿名函數(shù)中,然后創(chuàng)建了局部變量(findById),這些局部變量只能在當(dāng)前作用域中被訪問到。Person變量是在全局作用域中定義的,可以在任何地方都能訪問到。定義變量的時(shí)候不要丟掉var運(yùn)算符,如果丟掉var就會(huì)創(chuàng)建全局變量。如果需要定義全局變量,可以在全局作用域中定義,或者定義為window的屬性:
(function(exports){ var foo = "bar"; // 將變量暴露出去 exports.foo = foo; })(window); assertEqual(foo, "bar");“類”庫(kù)
jQuery 本身并不支持類,但通過插件的方式可以輕易引入類的支持,比如HJS。HJS 允許通過給$.Class.create傳入一組屬性來定義類:
var Person = $.Class.create({ // 構(gòu)造函數(shù) initialize: function(name) { this.name = name; } });
可以在創(chuàng)建類的時(shí)候傳入父類作為參數(shù),這樣就實(shí)現(xiàn)了類的繼承:
var Student = $.Class.create(Person, { price: function() { /* ... */ } }); var alex = new Student("Alex"); alex.pay();
可以直接給類掛載屬性:
Person.find = function(id){ /* ... */ };
HJS 的API 中同樣包含一些工具函數(shù),比如clone() 和equal() :
var alex = new Student("Alex"); var bill = alex.clone(); assert( alex.equal(bill) );
還有 Spine 同樣實(shí)現(xiàn)了類,通過直接在頁(yè)面中引入spine.js(http://maccman.github.com/spine/spine.js)來使用它:
jQuery 的作者John Resig 在他的博客中寫過一篇文章:專門講解如何實(shí)現(xiàn)經(jīng)典的類繼承。
公開記錄學(xué)習(xí)JS MVC,不知道能堅(jiān)持多久= =。以《基于MVC的JavaScript web富應(yīng)用開發(fā)》為主要學(xué)習(xí)資料。類的部分終于看完了,再慢慢消化。JS真是博大精深!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/85509.html
摘要:任何函數(shù)都可以用做構(gòu)造函數(shù),構(gòu)造函數(shù)必須使用運(yùn)算符作為前綴來創(chuàng)建新的實(shí)例。當(dāng)使用關(guān)鍵字來調(diào)用構(gòu)造函數(shù)時(shí),執(zhí)行上下文從全局對(duì)象變成一個(gè)空的上下文,這個(gè)上下文代表了新生成的實(shí)例。默認(rèn)情況下,如果構(gòu)造函數(shù)中沒有返回任何內(nèi)容,就會(huì)返回當(dāng)前的上下文。 公開記錄學(xué)習(xí)JS MVC,不知道能堅(jiān)持多久= =。以《基于MVC的JavaScript web富應(yīng)用開發(fā)》為主要學(xué)習(xí)資料。 JavaScr...
摘要:實(shí)際上,可以將其理解為某種形式的繼承。如果上下文是,則使用全局對(duì)象代替。例如的第個(gè)參數(shù)是上下文,后續(xù)是實(shí)際傳入的參數(shù)序列中允許更換上下文是為了共享狀態(tài),尤其是在事件回調(diào)中。 公開記錄學(xué)習(xí)JS MVC,不知道能堅(jiān)持多久= =。以《基于MVC的JavaScript web富應(yīng)用開發(fā)》為主要學(xué)習(xí)資料。接上一篇類的學(xué)習(xí),發(fā)現(xiàn)實(shí)在是看暈了,有些例子是能看懂在干嘛,但是不知道為什么這樣做,有的甚至...
摘要:以基于的富應(yīng)用開發(fā)為主要學(xué)習(xí)資料。下面用實(shí)現(xiàn)一個(gè)例子使用匿名函數(shù)來封裝一個(gè)作用域在頁(yè)面加載時(shí)綁定事件監(jiān)聽上面的代碼創(chuàng)建了控制器,這個(gè)控制器是放在變量下的命名空間。然后用了一個(gè)匿名函數(shù)封裝了一個(gè)作用域,以避免對(duì)全局作用域造成污染。 公開記錄學(xué)習(xí)JS MVC,不知道能堅(jiān)持多久= =。以《基于MVC的JavaScript web富應(yīng)用開發(fā)》為主要學(xué)習(xí)資料。 什么是MVC MVC 是一種設(shè)...
摘要:事件是應(yīng)用程序的核心,是所有內(nèi)容的驅(qū)動(dòng)。將對(duì)這兩種事件模型的支持都加入標(biāo)準(zhǔn)規(guī)范之中。根據(jù)型,事件首先被目標(biāo)元素所捕捉,然后向上冒泡。取消事件冒泡當(dāng)事件冒泡時(shí),可以通過數(shù)來終止冒泡,這個(gè)函數(shù)是對(duì)象中的方法。 事件是 JavaScript 應(yīng)用程序的核心,是所有內(nèi)容的驅(qū)動(dòng)。盡管后來W3C 對(duì)此做了標(biāo)準(zhǔn)化,但 IE 仍然堅(jiān)持使用與 W3C 不兼容的事件模型,直到 IE9 才遵循標(biāo)準(zhǔn)。有很多諸...
摘要:它通過數(shù)據(jù)模型進(jìn)行鍵值綁定及事件處理,通過模型集合器提供一套豐富的用于枚舉功能,通過視圖來進(jìn)行事件處理及與現(xiàn)有的通過接口進(jìn)行交互。 本人兼職前端付費(fèi)技術(shù)顧問,如需幫助請(qǐng)加本人微信hawx1993或QQ345823102,非誠(chéng)勿擾 1.為初學(xué)前端而不知道怎么做項(xiàng)目的你指導(dǎo) 2.指導(dǎo)并扎實(shí)你的JavaScript基礎(chǔ) 3.幫你準(zhǔn)備面試并提供相關(guān)指導(dǎo)性意見 4.為你的前端之路提供極具建設(shè)性的...
閱讀 1683·2021-11-15 11:38
閱讀 4538·2021-09-22 15:33
閱讀 2343·2021-08-30 09:46
閱讀 2191·2019-08-30 15:43
閱讀 835·2019-08-30 14:16
閱讀 2080·2019-08-30 13:09
閱讀 1262·2019-08-30 11:25
閱讀 709·2019-08-29 16:42