成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

《javascript語(yǔ)言精粹》學(xué)習(xí)筆記 - 對(duì)象

LoftySoul / 853人閱讀

摘要:對(duì)象適用于匯集和管理數(shù)據(jù)。一個(gè)對(duì)象字面量就是包圍在一對(duì)花括號(hào)的多個(gè)名值對(duì)。嘗試從對(duì)象里取值將會(huì)導(dǎo)致異常。亦不會(huì)觸及原型鏈中的任何對(duì)象。嚴(yán)格模式下,不能用刪除顯式聲明的標(biāo)識(shí)符,名稱或具名函數(shù)。

  

Javascirpt里的對(duì)象是無(wú)類型的。它對(duì)新屬性的名字和屬性的值沒(méi)有任何的限制。對(duì)象適用于匯集和管理數(shù)據(jù)。對(duì)象可以包括其他對(duì)象,所以它們可以容易地表示成樹(shù)狀或者圖形結(jié)構(gòu)。

對(duì)象字面量

創(chuàng)建一個(gè)自定義對(duì)象最簡(jiǎn)單的方式就是創(chuàng)建一個(gè)Object的實(shí)例,然后為它添加屬性和方法:

var person = new Object();
    person.name = "john";
    person.age = 16;
    person.say = function(){
        console.log(this.name + " " + this.age);
    };

后來(lái)對(duì)象字面量成為一個(gè)創(chuàng)建這種對(duì)象的首選方式。對(duì)象字面量提供一種非常方便的創(chuàng)建新對(duì)象的表示法。

var Person = {},
    Person2 = {
        name: "john",
        age: 16,
        say: function(){
            console.log(this.name + " " + this.age);
        }
    };

一個(gè)對(duì)象字面量就是包圍在一對(duì)花括號(hào)({})的多個(gè)名/值對(duì)。對(duì)象字面量可以出現(xiàn)任何允許表達(dá)式出現(xiàn)的地方。

屬性名可以包括空字符串在內(nèi)的任何字符。屬性名是一個(gè)合法的js標(biāo)示符而且不是保留字的話就不用引號(hào)括起來(lái)。特殊情況例如:"my-name"這種的話,因?yàn)?b>js中的標(biāo)示符中包含連接符(-)是不合法的,所以要用引號(hào)去包住,如果用下劃線(_)就不用了。

對(duì)象字面量屬性值里面可以在嵌套對(duì)象的。

var Person = {
    name: "john",
    Person2: {
        age: 16
    }
};
檢索

要檢索的對(duì)象包含的值,可以采用[]后綴中括住一個(gè)字符串表達(dá)式方式。也可以用.方法,但是前提要是一個(gè)合法的js標(biāo)示符且不是保留字。

person["name"];
person.name;

如果屬性值沒(méi)有的話,我們可以用||充當(dāng)默認(rèn)值。

var name = person["name"] || "john";

嘗試從undefind對(duì)象里取值將會(huì)導(dǎo)致TypEerror異常??梢酝ㄟ^(guò)&&運(yùn)算符來(lái)避免錯(cuò)誤。

flight.equipment // undefined
flight.equipment.model // TypeError
flight.equipment && flight.equipment.model// undefined
引用

對(duì)象是通過(guò)引用來(lái)傳遞的,而不是復(fù)制。

// 例子一
var stooge = {},
    x = stooge;
x.nickname = "john";
var nick = stooge.nickname;
alert(nick); // john

// 例子二
var a = {}, b = {}, c = {};
// a = b = c = {};

例子一的代碼因?yàn)?b>x和stooge是指向同一個(gè)對(duì)象的引用。

例子二的代碼其實(shí)a、bc都引用同一個(gè)對(duì)象。

更新

對(duì)象可以使用賦值語(yǔ)句來(lái)更新值。如果屬性名已經(jīng)存在的話,就回去被替換掉。如果值不存在,就擴(kuò)充到對(duì)象中。

var person = {
    name: "Ada"
}
person.name = "john"; // john
person.age = 16 // 16
原型
  

每個(gè)對(duì)象都能連接到一個(gè)原型對(duì)象,并且它可以從中繼承屬性。

當(dāng)你創(chuàng)建一個(gè)新的對(duì)象的時(shí)候,你可以有選擇性的某個(gè)對(duì)象作為它的原型。js給我們的機(jī)制是很復(fù)雜的,但是可以被明顯的簡(jiǎn)化,來(lái)給Object添加一個(gè)create方法。

if (typeof Object.beget !== "function") {
    Object.create = function(o){
        var F = function(){};
        F.prototype = o;
        return new F;
    };
}
var person = Object.create(person);

注意:原型連接在更新時(shí)是不會(huì)起作用的。當(dāng)對(duì)某個(gè)對(duì)象做出改變的時(shí)候,不會(huì)觸及該對(duì)象的原型。

原型鏈接只有在檢索值的時(shí)候才會(huì)用到。如果我們嘗試去獲取對(duì)象的某個(gè)值的時(shí)候,如果對(duì)象沒(méi)有該屬性名,那么js會(huì)嘗試去原型對(duì)象中獲取屬性值。如果那個(gè)原型也沒(méi)有的話,就會(huì)一直從它的原型里面找。如果最后還是找不到的話機(jī)會(huì)返回一個(gè)undfined。這個(gè)過(guò)程稱為委托

原型關(guān)系是一種動(dòng)態(tài)的關(guān)系。如果添加到一個(gè)新的屬性值到原型中,該屬性會(huì)立即對(duì)所有基于這個(gè)原型創(chuàng)建的對(duì)象可見(jiàn)。

反射

檢查對(duì)象并且確定對(duì)象有什么屬性是一件很容易的事情,只要嘗試的去檢索那個(gè)屬性并且驗(yàn)證取得的值。使用typeof來(lái)對(duì)確定屬性的類型。

var person = {
    name: "john",
    age: 16,
    say: function(){
        console.log(this.name + " - " + this.age);
    }
};
alert(typeof person.name); // string
alert(typeof person.age); // number
alert(typeof person.say); // function

另外一種方法是使用hasOwnProperty方法,如果對(duì)象擁有獨(dú)有的屬性值,它將會(huì)放回true。注意:hasOwnProperty方法不會(huì)檢查原型鏈。

alert(person.hasOwnProperty("name")); // true
alert(person.hasOwnProperty("sex")); // false
枚舉

for in循環(huán)可以用來(lái)遍歷一個(gè)對(duì)象中的說(shuō)有屬性名。
注意:使用for in循環(huán)過(guò)程中也會(huì)列出那些你不關(guān)心的原型中的屬性,如果想要過(guò)濾掉那些你不需要的值。你可以使用hasOwnProperty方法,以及typeof來(lái)排除函數(shù)。

for (var name in person) {
    if (typeof person[name] !== "function") {
        alert(person[name]);
    }
};

屬性名出現(xiàn)的順序是不確定的,因此要對(duì)所有的可能出現(xiàn)的順序有所準(zhǔn)備。如果想要確保屬性以特定的順序出現(xiàn),最好的辦法就是完全避免使用for in語(yǔ)句,而是創(chuàng)建一個(gè)數(shù)組,在其中以正確的順序包含屬性名。

var i = 0,
    properties = [
        "name",
        "age"
    ];
for (; i < properties.length; i++) {
    alert(person[properties[i]]);
};

通過(guò)使用for循環(huán)而不是for in循環(huán),就可以得到想要的值,也不用擔(dān)心可能發(fā)掘出原型鏈中的屬性。

刪除

delete運(yùn)算符可以用來(lái)刪除對(duì)象的屬性。如果對(duì)象包含這個(gè)屬性,那么該屬性就會(huì)被移除。亦不會(huì)觸及原型鏈中的任何對(duì)象。

var Person = function(name, age){
    this.name = name;
    this.age = age;
};
Person.prototype.name = "Ada";

var person = new Person("john", 16);

alert(person.name); // john
delete person.name;
alert(person.name); // Ada

刪除對(duì)象的屬性可能會(huì)讓來(lái)自原型鏈中的屬性透現(xiàn)出來(lái)。

  

嚴(yán)格模式下,不能用delete 刪除顯式聲明的標(biāo)識(shí)符,名稱或具名函數(shù)。

減少全局變量污染

js可以很隨意去定義全局變量來(lái)容納你的應(yīng)用的所有的資源。不好的是,全局變量削弱了程序的靈活性,應(yīng)該都要避免使用。

最小化使用全局變量的方法之一就是為你的應(yīng)用只創(chuàng)建一個(gè)唯一的全局變量。

var MyApp = {};

這個(gè)變量就會(huì)成為你的應(yīng)用的容器了。

MyApp.person = {
    name: "john",
    age: 16
};

MyApp.person2 = {
    name: "Age",
    age: 14,
    sayName: function(){
        alert("name: " + this.name);
    }
};

只要把全局性的資源都納入一個(gè)名稱空間下,自己寫(xiě)的程序與其他的程序、組件或者類庫(kù)之間發(fā)生的沖突就會(huì)大大的減少。自己寫(xiě)的程序也會(huì)變得更加容易的閱讀。還有另外一種方法也是可以有效的減少全局污染,那就是閉包。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85562.html

相關(guān)文章

  • javascript語(yǔ)言精粹學(xué)習(xí)筆記 - 繼承

    摘要:但采用構(gòu)造器調(diào)用模式,即是使用了前綴去調(diào)用一個(gè)函數(shù)時(shí),函數(shù)執(zhí)行的方式會(huì)改變。對(duì)象包含構(gòu)造器需要構(gòu)造一個(gè)新的實(shí)例的所有信息。構(gòu)造器的變量和內(nèi)部函數(shù)變成了該實(shí)例的私有成員。 JavaScript 是一門(mén)弱類型語(yǔ)言,從不需要類型轉(zhuǎn)換。對(duì)象繼承關(guān)系變得無(wú)關(guān)緊要。對(duì)于一個(gè)對(duì)象來(lái)說(shuō)重要的時(shí)它能夠做什么,而不是它從哪里來(lái)。 閱讀《javascript語(yǔ)言精粹》筆記! 偽類 js的原型存...

    harriszh 評(píng)論0 收藏0
  • javascript語(yǔ)言精粹學(xué)習(xí)筆記 - 數(shù)組方法實(shí)現(xiàn)

    摘要:在中數(shù)組是經(jīng)常被使用到的,我們除了要學(xué)習(xí)數(shù)組的方法,還需要了解誒一下某一些方法是如何來(lái)實(shí)現(xiàn)的。然而我看了語(yǔ)言精粹中方法的一章,想記錄下書(shū)上的代碼,以便加深印象。方法移除數(shù)組中的第一個(gè)元素并且放回該元素。 在js中數(shù)組是經(jīng)常被使用到的,我們除了要學(xué)習(xí)數(shù)組的方法,還需要了解誒一下某一些方法是如何來(lái)實(shí)現(xiàn)的。然而我看了《javascript語(yǔ)言精粹》中方法的一章,想記錄下書(shū)上的代碼,以便加深印...

    felix0913 評(píng)論0 收藏0
  • 【閱讀筆記javascript 語(yǔ)言精粹

    摘要:前言由于最近的項(xiàng)目用到了一些的代碼,所以我?guī)е闷嫘?,認(rèn)真閱讀了這本書(shū),粗略地了解語(yǔ)言的基本結(jié)構(gòu)和特性,對(duì)于一些不熟悉的新概念,以記錄的形式加強(qiáng)印象,也是對(duì)學(xué)習(xí)的反思總結(jié)。 前言 由于最近的項(xiàng)目用到了一些js的代碼,所以我?guī)е闷嫘模J(rèn)真閱讀了這本書(shū),粗略地了解js語(yǔ)言的基本結(jié)構(gòu)和特性,對(duì)于一些不熟悉的新概念,以記錄的形式加強(qiáng)印象,也是對(duì)學(xué)習(xí)的反思總結(jié)。 一、字面量(literals...

    tangr206 評(píng)論0 收藏0
  • javascript語(yǔ)言精粹學(xué)習(xí)筆記 - 遞歸函數(shù)

    摘要:遞歸函數(shù)就是會(huì)直接或者間接地調(diào)用自身的一種函數(shù)。一般來(lái)說(shuō),一個(gè)遞歸函數(shù)調(diào)用自身去解決它的子問(wèn)題。書(shū)上第二個(gè)例子是說(shuō)遞歸函數(shù)可以非常高效率的操作樹(shù)形結(jié)構(gòu),比如。有一些語(yǔ)言提供了尾遞歸的優(yōu)化。好運(yùn)的是,給我們帶來(lái)了尾遞歸,詳細(xì)迎接使用尾遞歸。 遞歸函數(shù)就是會(huì)直接或者間接地調(diào)用自身的一種函數(shù)。遞歸是一種強(qiáng)大的編程技術(shù),它把一問(wèn)題分解為一組相似的子問(wèn)題,每一個(gè)都用一個(gè)尋常解去解決。一般來(lái)...

    Ryan_Li 評(píng)論0 收藏0
  • JavaScript 語(yǔ)言精粹》讀書(shū)筆記 - 函數(shù)

    摘要:語(yǔ)言精粹讀書(shū)筆記第四章函數(shù)函數(shù)字面量函數(shù)字面量包含個(gè)部分第一部分,保留字第二部分,函數(shù)名,它可以被忽略。這個(gè)超級(jí)延遲綁定使得函數(shù)對(duì)高度復(fù)用。構(gòu)造器調(diào)用模式一個(gè)函數(shù),如果創(chuàng)建的目的就是希望結(jié)合的前綴來(lái)調(diào)用,那它就被稱為構(gòu)造器構(gòu)造。 《JavaScript 語(yǔ)言精粹》 讀書(shū)筆記 第四章 函數(shù) Functions 函數(shù)字面量 函數(shù)字面量包含4個(gè)部分: 第一部分, 保留字 function...

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

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

0條評(píng)論

LoftySoul

|高級(jí)講師

TA的文章

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