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

資訊專欄INFORMATION COLUMN

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

caozhijian / 2152人閱讀

摘要:任何函數(shù)都可以用做構(gòu)造函數(shù),構(gòu)造函數(shù)必須使用運(yùn)算符作為前綴來(lái)創(chuàng)建新的實(shí)例。當(dāng)使用關(guān)鍵字來(lái)調(diào)用構(gòu)造函數(shù)時(shí),執(zhí)行上下文從全局對(duì)象變成一個(gè)空的上下文,這個(gè)上下文代表了新生成的實(shí)例。默認(rèn)情況下,如果構(gòu)造函數(shù)中沒(méi)有返回任何內(nèi)容,就會(huì)返回當(dāng)前的上下文。

公開(kāi)記錄學(xué)習(xí)JS MVC,不知道能堅(jiān)持多久= =。以《基于MVC的JavaScript web富應(yīng)用開(kāi)發(fā)》為主要學(xué)習(xí)資料。

  

JavaScript類的內(nèi)容好多,我腦容量太小,分兩次學(xué)習(xí)

JavaScript的類

JavaScript是基于原型的語(yǔ)言,沒(méi)有包含內(nèi)置的類,但是通過(guò)JavaScript可以輕易地模擬出經(jīng)典的類。JavaScript中有構(gòu)造函數(shù)和 new 運(yùn)算符。構(gòu)造函數(shù)用來(lái)給實(shí)例對(duì)象初始化屬性和值。任何JavaScript函數(shù)都可以用做構(gòu)造函數(shù),構(gòu)造函數(shù)必須使用new 運(yùn)算符作為前綴來(lái)創(chuàng)建新的實(shí)例。

new 運(yùn)算符改變了函數(shù)的執(zhí)行上下文,同時(shí)改變了return 語(yǔ)句的行為。實(shí)際上,使用new和構(gòu)造函數(shù)和傳統(tǒng)的實(shí)現(xiàn)了類的語(yǔ)言中的使用方法是很類似的:

var Person = function(name) {
  this.name = name;
};

// 實(shí)例化一個(gè)Person
var alice = new Person("alice");

// 檢查這個(gè)實(shí)例
assert( alice instanceof Person );

構(gòu)造函數(shù)的命名通常使用駝峰命名法,首字母大寫(xiě),以此和普通的函數(shù)區(qū)分開(kāi)來(lái),這是一種習(xí)慣用法。

不要省略new前綴的方式來(lái)調(diào)用構(gòu)造函數(shù):

// 不要這么做!
Person("bob"); //=> undefined

這個(gè)函數(shù)只會(huì)返回undefined,并且執(zhí)行上下文是window(全局)對(duì)象,你無(wú)意間創(chuàng)建了一個(gè)全局變量name。調(diào)用構(gòu)造函數(shù)時(shí)不要丟掉new關(guān)鍵字。

當(dāng)使用new關(guān)鍵字來(lái)調(diào)用構(gòu)造函數(shù)時(shí),執(zhí)行上下文從全局對(duì)象(window)變成一個(gè)空的上下文,這個(gè)上下文代表了新生成的實(shí)例。因此,this關(guān)鍵字指向當(dāng)前創(chuàng)建的實(shí)例。盡管理解起來(lái)有些繞,實(shí)際上其他語(yǔ)言內(nèi)置類機(jī)制的實(shí)現(xiàn)也是如此。默認(rèn)情況下,如果構(gòu)造函數(shù)中沒(méi)有返回任何內(nèi)容,就會(huì)返回this——當(dāng)前的上下文。要不然就返回任意非原始類型的值。

創(chuàng)建自己的類模擬庫(kù)
var Class = function(){

    var klass = function(){
      this.init.apply(this, arguments);
    };

    klass.prototype.init = function(){};

    return klass;
};

var Person = new Class;

Person.prototype.init = function(){
  // 基于Person 的實(shí)例做初始化
};

// 用法:
var person = new Person;

  

由于 JavaScript 2 規(guī)范從未被實(shí)現(xiàn)過(guò),class 一直都是保留字。最常見(jiàn)的做法是將變量名 class 改為 _classklass

給類添加函數(shù)

在JavaScript 中,在構(gòu)造函數(shù)中給類添加函數(shù)和給對(duì)象添加屬性是一樣的:

Person.find = function(id){ /*...*/ };
var person = Person.find(1);

要想給構(gòu)造函數(shù)添加實(shí)例函數(shù),則需要用到構(gòu)造函數(shù)的prototype :

Person.prototype.breath = function(){ /*...*/ };
var person = new Person;
person.breath();

一種常用的模式是給類的 prototype 起一個(gè)別名fn,寫(xiě)起來(lái)也更簡(jiǎn)單:

Person.fn = Person.prototype;
Person.fn.run = function(){ /*...*/ };

這種模式在jQuery 的插件開(kāi)發(fā)中是很常見(jiàn)的,將函數(shù)添加至jQuery.fn 中也就相當(dāng)于添加至jQuery 的原型中。

給實(shí)現(xiàn)了類機(jī)制的類庫(kù)添加方法

給類添加屬性和給構(gòu)造函數(shù)添加屬性是一樣的。

直接給類設(shè)置屬性和設(shè)置其靜態(tài)成員是等價(jià)的:

var Person = new Class;

// 直接給類添加靜態(tài)方法
Person.find = function(id){ /* ... */ };

// 這樣我們可以直接調(diào)用它們
var person = Person.find(1);

給類的原型設(shè)置的屬性在類的實(shí)例中也是可用的:

var Person = new Class;

// 在原型中定義函數(shù)
Person.prototype.save = function(){ /* ... */ };

// 這樣就可以在實(shí)例中調(diào)用它們
var person = new Person;
person.save();

這樣很難一眼就分辨出類的靜態(tài)屬性和實(shí)例的屬性。因此我們采用另外一種不同的方法來(lái)給類添加屬性,這里用到了兩個(gè)函數(shù)extend()include()

var Class = function () {
    var klass = function () {
        this.init.apply(this, arguments);
    };

    klass.prototype.init = function () {};

    // 定義 prototype 的別名
    klass.fn = klass.prototype;

    // 定義類的別名
    klass.fn.parent = klass;

    // 給類添加屬性
    klass.extend = function (obj) {
        var extended = obj.extended;
        for (var i in obj) {
            klass[i] = obj[i];
        }
        if (extended) 
            extended(klass)
    };

    // 給實(shí)例添加屬性
    klass.include = function (obj) {
        var included = obj.included;
        for (var i in obj) {
            klass.fn[i] = obj[i];
        }
        if (included) 
            included(klass)
    };
    return klass;
};

這段代碼使用extend() 函數(shù)來(lái)生成一個(gè)類,這個(gè)函數(shù)的參數(shù)是一個(gè)對(duì)象。通過(guò)迭代將對(duì)象的屬性直接復(fù)制到類上:

var Person = new Class;
Person.extend({
    find: function(id) { /* ... */ },
    exists: functions(id) { /* ... */ }
});
var person = Person.find(1);

include() 函數(shù)的工作原理也一樣,只不過(guò)不是將屬性復(fù)制至類中,而是復(fù)制至類的原型中。換句話說(shuō),這里的屬性是類實(shí)例的屬性,而不是類的靜態(tài)屬性。

var Person = new Class;
Person.include({
    save: function(id) { /* ... */ },
    destroy: functions(id) { /* ... */ }
});
var person = new Person;
person.save();

同樣地,這里的實(shí)現(xiàn)支持extended 和included 回調(diào)。將屬性傳入對(duì)象后就會(huì)觸發(fā)這兩
個(gè)回調(diào):

Person.extend({
    extended: function(klass) {
        console.log(klass, " was extended!");
    }
});

這種寫(xiě)法已經(jīng)可以支持模塊了。模塊是可重用的代碼段,用這種方法可以實(shí)現(xiàn)各種繼承,用來(lái)在類之間
共享通用的屬性。

var ORMModule = {
    save: function(){
        // 共享的函數(shù)
    }
};

var Person = new Class;
var Asset = new Class;
Person.include(ORMModule);
Asset.include(ORMModule);

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/85500.html

相關(guān)文章

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

    摘要:實(shí)際上,可以將其理解為某種形式的繼承。如果上下文是,則使用全局對(duì)象代替。例如的第個(gè)參數(shù)是上下文,后續(xù)是實(shí)際傳入的參數(shù)序列中允許更換上下文是為了共享狀態(tài),尤其是在事件回調(diào)中。 公開(kāi)記錄學(xué)習(xí)JS MVC,不知道能堅(jiān)持多久= =。以《基于MVC的JavaScript web富應(yīng)用開(kāi)發(fā)》為主要學(xué)習(xí)資料。接上一篇類的學(xué)習(xí),發(fā)現(xiàn)實(shí)在是看暈了,有些例子是能看懂在干嘛,但是不知道為什么這樣做,有的甚至...

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

    摘要:基于函數(shù)進(jìn)行調(diào)用的,用來(lái)確保函數(shù)是在指定的值所在的上下文中調(diào)用的。添加私有函數(shù)目前上面為類庫(kù)添加的屬性都是公開(kāi)的,可以被隨時(shí)修改。以基于的富應(yīng)用開(kāi)發(fā)為主要學(xué)習(xí)資料。 控制類庫(kù)的作用域 在類和實(shí)例中都添加proxy函數(shù),可以在事件處理程序之外處理函數(shù)的時(shí)候保持類的作用域。下面是不用proxy的辦法: var Class = function(parent){ var klas...

    Rango 評(píng)論0 收藏0
  • React學(xué)習(xí)筆記—Why React?

    摘要:官方說(shuō)法注本人英語(yǔ)二十六級(jí)是和用來(lái)創(chuàng)建用戶界面的庫(kù)。很多人將認(rèn)為是中的。怎么說(shuō)呢現(xiàn)在的自己就是個(gè)跟風(fēng)狗啊,什么流行先學(xué)習(xí)了再說(shuō),再看看能不能應(yīng)用在具體項(xiàng)目上。暫時(shí)先停下的學(xué)習(xí),坐等。不過(guò)學(xué)習(xí)的腳步還是跟不上潮流的發(fā)展速度啊。 Why React? 官方說(shuō)法 注:本人英語(yǔ)二十六級(jí) React是Facebook和Instagram用來(lái)創(chuàng)建用戶界面的JavaScript庫(kù)。很多...

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

    摘要:以基于的富應(yīng)用開(kāi)發(fā)為主要學(xué)習(xí)資料。下面用實(shí)現(xiàn)一個(gè)例子使用匿名函數(shù)來(lái)封裝一個(gè)作用域在頁(yè)面加載時(shí)綁定事件監(jiān)聽(tīng)上面的代碼創(chuàng)建了控制器,這個(gè)控制器是放在變量下的命名空間。然后用了一個(gè)匿名函數(shù)封裝了一個(gè)作用域,以避免對(duì)全局作用域造成污染。 公開(kāi)記錄學(xué)習(xí)JS MVC,不知道能堅(jiān)持多久= =。以《基于MVC的JavaScript web富應(yīng)用開(kāi)發(fā)》為主要學(xué)習(xí)資料。 什么是MVC MVC 是一種設(shè)...

    xorpay 評(píng)論0 收藏0
  • JavaScript MVC 學(xué)習(xí)筆記(六)模型之ORM

    摘要:模型應(yīng)當(dāng)從視圖和控制器中解耦出來(lái)。與數(shù)據(jù)操作和行為相關(guān)的邏輯都應(yīng)當(dāng)放入模型中,通過(guò)命名空間進(jìn)行管理。在應(yīng)用中,對(duì)象關(guān)系映射也是一種非常有用的技術(shù),它可以用來(lái)做數(shù)據(jù)管理及用做模型。以基于的富應(yīng)用開(kāi)發(fā)為主要學(xué)習(xí)資料。 MVC 和命名空間 要確保應(yīng)用中的視圖、狀態(tài)和數(shù)據(jù)彼此清晰分離,才能讓架構(gòu)更加整潔有序且更加健壯。模型應(yīng)當(dāng)從視圖和控制器中解耦出來(lái)。與數(shù)據(jù)操作和行為相關(guān)的邏輯都應(yīng)當(dāng)放入模型...

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

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

0條評(píng)論

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