国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript MVC 學(xué)習(xí)筆記(四)類的使用(下)

Rango / 1017人閱讀

摘要:基于函數(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(){ /* ... */ }
});

如果沒有使用proxyclick()的回調(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

相關(guān)文章

  • JavaScript MVC 學(xué)習(xí)筆記(二)類的使用(上)

    摘要:任何函數(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...

    caozhijian 評(píng)論0 收藏0
  • JavaScript MVC 學(xué)習(xí)筆記(三)類的使用(中)

    摘要:實(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í)在是看暈了,有些例子是能看懂在干嘛,但是不知道為什么這樣做,有的甚至...

    DandJ 評(píng)論0 收藏0
  • JavaScript MVC 學(xué)習(xí)筆記(一)初識(shí)JS MVC

    摘要:以基于的富應(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è)...

    xorpay 評(píng)論0 收藏0
  • JavaScript MVC 學(xué)習(xí)筆記(五)事件的基本操作

    摘要:事件是應(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)。有很多諸...

    Julylovin 評(píng)論0 收藏0
  • Backbone.js學(xué)習(xí)筆記(一)

    摘要:它通過數(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è)性的...

    FrancisSoung 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<