JavaScript類(lèi)型系統(tǒng)之Object詳解
前面的話(huà)
在javascript中,對(duì)象為王;Javascript里的幾乎所有東西都是對(duì)象或者用起來(lái)像對(duì)象。理解了對(duì)象,就理解了Javascript。在javascript中,引用類(lèi)型是一種數(shù)據(jù)結(jié)構(gòu),用于將數(shù)據(jù)和功能組織在一起,它也常被稱(chēng)為類(lèi)。引用類(lèi)型有時(shí)也被稱(chēng)為對(duì)象定義,因?yàn)樗鼈兠枋龅氖且活?lèi)對(duì)象所具有的屬性和方法
大部分引用類(lèi)型的值都是Object類(lèi)型的實(shí)例;而且,Object也是javascript中使用最多的一個(gè)類(lèi)型。雖然Object實(shí)例不具備多少功能,但對(duì)于在應(yīng)用程序中存儲(chǔ)和傳輸數(shù)據(jù),它們確實(shí)是非常理想的選擇
創(chuàng)建對(duì)象
有兩種Object類(lèi)型的創(chuàng)建方法
[1]Object構(gòu)造函數(shù)
var person = new Object(); //如果不給構(gòu)造函數(shù)傳遞參數(shù)可以不加括號(hào) var person = new Object; person.name = 'bai'; person.age = 29; //創(chuàng)建無(wú)屬性的空對(duì)象 var cody1 = new Object(); var cody2 = new Object(undefined); var cody3 = new Object(null); console.log(typeof cody1,typeof cody2, typeof cody3);//object object object //創(chuàng)建string、number、array、function、boolean、regex console.log(new Object('foo')); console.log(new Object(1)); console.log(new Object([])); console.log(new Object(function(){})); console.log(new Object(true)); console.log(new Object(/\bbt[a-z]+\b/));
[注意]Object()構(gòu)造函數(shù)本身就是對(duì)象,構(gòu)造函數(shù)是基于Function構(gòu)造函數(shù)創(chuàng)建的對(duì)象
[2]使用對(duì)象字面量
Javascript提供了叫做字面量的快捷方式,用于創(chuàng)建大多數(shù)原生對(duì)象值。使用字面量只是隱藏了與使用new 操作符相同的
基本過(guò)程
var person = { name : 'bai', age : 29, 5 : true };
[注意]在對(duì)象字面量中使用逗號(hào)來(lái)分隔不同的屬性,但是在最后一個(gè)屬性后面添加逗號(hào),會(huì)在IE7-導(dǎo)致錯(cuò)誤
使用對(duì)象字面量的方法來(lái)定義對(duì)象,屬性名會(huì)自動(dòng)轉(zhuǎn)換成字符串
//同上 var person = { 'name' : 'bai', 'age' : 29, '5' : true };
如果留空其花括號(hào),則可以定義只包含默認(rèn)屬性和方法的對(duì)象
//等價(jià)于var person = new Object(); var person = {}; [tips]使用對(duì)象字面量封裝多個(gè)可選參數(shù) function displayInfo(args){ var output = ''; if(typeof args.name == 'string'){ output += 'name:' + args.name +'\n'; } if(typeof args.age == 'number'){ output += 'Age:' + args.age + '\n'; } console.log(output); }; displayInfo({ name: 'Nicholas', age: 29 }); displayInfo({ name: 'match' });
以上這種傳遞參數(shù)的模式最適合需要向函數(shù)傳入大量可選參數(shù)的情況。一般來(lái)說(shuō),雖然命名參數(shù)容易處理,但有多個(gè)可選參數(shù)時(shí)就會(huì)不夠靈活。因此,對(duì)于必須值使用形參,而使用對(duì)象字面量來(lái)封裝多個(gè)可選參數(shù)
設(shè)置對(duì)象
有兩種訪(fǎng)問(wèn)對(duì)象屬性的方法,可以用點(diǎn)表示法或中括號(hào)表示法獲取、設(shè)置或更新對(duì)象的屬性
中括號(hào)法的兩個(gè)優(yōu)點(diǎn)分別是可以通過(guò)變量來(lái)訪(fǎng)問(wèn)屬性、屬性名稱(chēng)可以為Javascript無(wú)效標(biāo)識(shí)符
[注意]變量中可以存在中文,因?yàn)橹形南喈?dāng)于字符,與英文字符同樣對(duì)待,因此可以寫(xiě)成person.白或person['白']
var myObject = { 123:'zero', class:'foo' }; console.log(myObject['123'],myObject['class']);//'zero' 'foo' console.log(myObject.123);//報(bào)錯(cuò)
方括號(hào)中的值若是非字符串類(lèi)型會(huì)使用String()隱式轉(zhuǎn)換成字符串再輸出;如果是字符串類(lèi)型,若有引號(hào)則原值輸出,否則會(huì)被識(shí)別為變量,若變量未定義,則報(bào)錯(cuò)
person[0] = 1; //[]中的數(shù)字不會(huì)報(bào)錯(cuò),而是自動(dòng)轉(zhuǎn)換成字符串 person[a] = 1; //[]中符合變量命名規(guī)則的元素會(huì)被當(dāng)成變量,變量未被定義,而報(bào)錯(cuò) person[''] = 2; //[]中的空字符串不會(huì)報(bào)錯(cuò),是實(shí)際存在的且可以調(diào)用,但不會(huì)在控制臺(tái)右側(cè)的集合中顯示 person[undefined 或 null 或 true 或 false] = 4;// 不會(huì)報(bào)錯(cuò),而是自動(dòng)轉(zhuǎn)換成字符串 person['白'] = 6; // 不會(huì)報(bào)錯(cuò)
刪除對(duì)象
delete操作符可以用于將屬性從一個(gè)對(duì)象中完全刪除。delete是將屬性從一個(gè)對(duì)象中刪除的唯一辦法,將屬性設(shè)置為undefined或null只能改變屬性的值,而不會(huì)將屬性從對(duì)象中刪除。delete只能刪除對(duì)象下的數(shù)據(jù),其他5種基礎(chǔ)類(lèi)型的值是刪除不掉的
[注意]delete不會(huì)刪除在原型鏈上找到的屬性
var foo = {bar: 'bar'}; delete foo.bar; console.log('bar' in foo);//false var a = 123; delete a; console.log(a);//123
如果在全局狀態(tài)下聲明變量a,相當(dāng)于window對(duì)象下的一個(gè)數(shù)據(jù)a,可以通過(guò)window.a或a來(lái)對(duì)a賦值,且window.a和a的值總是相等,但就是無(wú)法刪除
var a; a = 10; console.log(a,window.a);//10 10 window.a = 20; console.log(a,window.a);//20 20 delete a ; console.log(a,window.a);//20 20 delete window.a; console.log(a,window.a);//20 20
如果用window.b 來(lái)聲明并賦值(b相當(dāng)于聲明在window對(duì)象下),可以刪除,且用delete b 和 delete window.b 的效果相同,刪除后,console.log(b)提示變量不存在,console.log(window.b)提示undefined
window.b = 10; console.log(b,window.b);//10 10 delete b; console.log(b);//報(bào)錯(cuò) console.log(window.b);//undefined window.b = 10; console.log(b,window.b);//10 10 delete window.b; console.log(b);//報(bào)錯(cuò) console.log(window.b);//undefined
對(duì)象嵌套
對(duì)象可以嵌套,但必須逐層取值
var student = { name : { chinese : 1, englisth : 2 }, sex : 1, age : 26 }
[注意]取值只能一層一層取,如student.name.chinese,而不能跨過(guò)name,直接用student.chinese,因?yàn)榕cname的同級(jí)下也可能有叫chinese的元素
var object1 = { object1_1:{ object1_1_1:{foo: 'bar'}, object1_1_2:{} }, object1_2:{ object1_2_1:{}, object1_2_2:{} } }; console.log(object1.object1_1.object1_1_1.foo);//bar
實(shí)例方法
constructor:保存著用于創(chuàng)建當(dāng)前對(duì)象的函數(shù)
hasOwnProperty(propertyName):用于檢查給定的屬性在當(dāng)前對(duì)象實(shí)例中(而不是在實(shí)例的原型中)是否存在。其中,propertyName必須以字符串形式指定
isPrototypeOf(object):用于檢查傳入的對(duì)象是否是傳入對(duì)象的原型
propertyIsEnumerable(propertyName):用于檢查給定的屬性是否能夠使用for-in語(yǔ)句來(lái)枚舉。其中,propertyName必須以字符串形式指定
toLocaleString():返回對(duì)象的字符串表示,該字符串與執(zhí)行環(huán)境的地區(qū)對(duì)應(yīng)
toString():返回對(duì)象的字符串表示
valueOf():返回對(duì)象的字符串、數(shù)值或布爾值表示,通常與toString()方法的返回值相同
var myObject = { mark: true }; console.log(myObject.constructor);//function Object(){} console.log(myObject.hasOwnProperty('mark'));//true console.log(Object.prototype.isPrototypeOf(myObject));//true console.log(myObject.propertyIsEnumerable('mark'));//true console.log(myObject.toLocaleString());//[object Object] console.log(myObject.toString());//[object Object] console.log(typeof myObject.valueOf(),myObject.valueOf());// object Object{mark:true}
小結(jié):
Object類(lèi)型
對(duì)象其實(shí)就是一組數(shù)據(jù)和功能的集合。對(duì)象可以通過(guò)執(zhí)行new操作符后跟要?jiǎng)?chuàng)建的對(duì)象類(lèi)型的名稱(chēng)來(lái)創(chuàng)建。而創(chuàng)建Object類(lèi)型的實(shí)例并為其添加屬性和(或)方法,就可以創(chuàng)建自定義對(duì)象。
var o = new Object();
Object的每個(gè)實(shí)例都具有下列屬性和方法:
● constructor——保存著用于創(chuàng)建當(dāng)前對(duì)象的函數(shù)
● hasOwnProperty(propertyName)——用于檢查給定的屬性在當(dāng)前對(duì)象實(shí)例中(而不是在實(shí)例的原型中)是否存在。其中,作為參數(shù)的屬性名(propertyName)必須以字符串形式指定(例如:o.hasOwnProperty("name"))
● isPrototypeOf(object)——用于檢查傳入的對(duì)象是否是另一個(gè)對(duì)象的原型
● propertyIsEnumerable(propertyName)——用于檢查給定的屬性是否能夠使用for-in語(yǔ)句來(lái)枚舉
● toString()——返回對(duì)象的字符串表示
● valueOf()——返回對(duì)象的字符串、數(shù)值或布爾值表示。通常與toString()方法的返回值相同。
- java使用JSONObject實(shí)例
- js如何獲取object類(lèi)型里的鍵值
- js之ActiveX控件使用說(shuō)明 new ActiveXObject()
- 刪除Javascript Object中間的key
- Javascript Object 對(duì)象學(xué)習(xí)筆記
- JavaScript中的object轉(zhuǎn)換成number或string規(guī)則介紹
- Nodejs學(xué)習(xí)筆記之Global Objects全局對(duì)象
- 淺談Javascript中的Function與Object
- javascript中Object使用詳解
- javascript 對(duì)象數(shù)組根據(jù)對(duì)象object key的值排序
- JavaScript使用ActiveXObject訪(fǎng)問(wèn)Access和SQL Server數(shù)據(jù)庫(kù)
- js如何打印object對(duì)象
相關(guān)文章
three.js顯示中文字體與tween應(yīng)用詳析
這篇文章主要給大家介紹了關(guān)于three.js顯示中文字體與tween應(yīng)用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01JavaScript寫(xiě)的一個(gè)DIV 彈出網(wǎng)頁(yè)對(duì)話(huà)框
自己整理得一個(gè)JavaScript寫(xiě)的一個(gè)DIV 彈出網(wǎng)頁(yè)對(duì)話(huà)框2009-08-08避免回車(chē)鍵導(dǎo)致的頁(yè)面無(wú)意義刷新的解決方法
相信大家在實(shí)現(xiàn)頁(yè)面局部刷新過(guò)程中都遇到過(guò)類(lèi)似的問(wèn)題:在文本框中輸入完要搜索的關(guān)鍵字段,按回車(chē)結(jié)果整個(gè)頁(yè)面刷新了,局部刷新肯定失敗。2011-04-04js null undefined 空區(qū)別說(shuō)明
js里面這三種東西總是讓人疑惑,特此整理一下2010-06-06JavaScript分頁(yè)功能的實(shí)現(xiàn)方法
這篇文章主要介紹了JavaScript分頁(yè)功能的實(shí)現(xiàn)方法,涉及javascript操作分頁(yè)的相關(guān)技巧,需要的朋友可以參考下2015-04-04JavaScript中標(biāo)識(shí)符提升問(wèn)題
標(biāo)識(shí)符指的是javascript中定義的符號(hào),標(biāo)識(shí)符可以由任意順序的大小寫(xiě)字母、數(shù)字、下劃線(xiàn)和美元符號(hào)組成,但標(biāo)識(shí)符不能以數(shù)字開(kāi)頭,也不能是javascript中的保留關(guān)鍵字。并且要注意,javascript是嚴(yán)格區(qū)分大小寫(xiě)的。2015-06-06css3元素簡(jiǎn)單的閃爍效果實(shí)現(xiàn)(html5 jquery)
本篇文章主要介紹了css3元素簡(jiǎn)單的閃爍效果實(shí)現(xiàn)(html5 jquery) 需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-12-12