摘要:對(duì)象適用于匯集和管理數(shù)據(jù)。一個(gè)對(duì)象字面量就是包圍在一對(duì)花括號(hào)的多個(gè)名值對(duì)。嘗試從對(duì)象里取值將會(huì)導(dǎo)致異常。亦不會(huì)觸及原型鏈中的任何對(duì)象。嚴(yán)格模式下,不能用刪除顯式聲明的標(biāo)識(shí)符,名稱或具名函數(shù)。
對(duì)象字面量Javascirpt里的對(duì)象是無(wú)類型的。它對(duì)新屬性的名字和屬性的值沒(méi)有任何的限制。對(duì)象適用于匯集和管理數(shù)據(jù)。對(duì)象可以包括其他對(duì)象,所以它們可以容易地表示成樹(shù)狀或者圖形結(jié)構(gòu)。
創(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、b和c都引用同一個(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
摘要:但采用構(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的原型存...
摘要:在中數(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ū)上的代碼,以便加深印...
摘要:前言由于最近的項(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...
摘要:遞歸函數(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)...
摘要:語(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...
閱讀 2400·2023-04-26 02:54
閱讀 2321·2021-10-14 09:43
閱讀 3371·2021-09-22 15:19
閱讀 2850·2019-08-30 15:44
閱讀 2708·2019-08-30 12:54
閱讀 990·2019-08-29 18:43
閱讀 1943·2019-08-29 17:12
閱讀 1335·2019-08-29 16:40