1. 程式人生 > 實用技巧 >JavaScript 物件的建立和操作

JavaScript 物件的建立和操作

<script> //物件是屬性的無序集合,每個屬性都是一個名/值對.屬性名稱是一個字串. //物件種類 //內建物件(nativeobject)是由ECMAScript規範定義的物件或類。例如,陣列、函式、日期和正則表示式都是內建物件 //宿主物件(hostobject)是由JavaScript直譯器所嵌入的宿主環境(比如Web瀏覽器)定義的,常見的宿主物件有window,document等 //自定義物件(user-definedobject)是由執行中的JavaScript程式碼建立的物件。 //物件的建立 //物件直接量是由若干名/值對組成的,名/值對中間用冒號分隔,名/值對之間用逗號分隔,整個物件用花括號括起來。 //屬性名可以是JavaScript識別符號(即變數符號,如a,b,c)也可以是字串。 //屬性的值可以是任意型別的JavaScript表示式,表示式的值(可以是基本資料型別的值也可以是物件型別的值)就是這個屬性的值。 //方法一 //letempty={}//可以是沒人任何屬性的物件 //letperson={ //name:"小小", //"name":"小小",//加引號定義也可以,呼叫直接person.name(不加引號,加引號就錯了) //height:"175cm", //weight:"50", //eating:function(){ //console.log("會吃飯"); //} //}//還可以加函式 //console.log(person);//{name:"小小",height:"175cm",weight:"50",eating:ƒ} //console.log(person.name);//小小 ////呼叫物件裡面的屬性物件名.屬性 //person.eating();//會吃飯 //呼叫物件裡面的函式。直接物件名.函式名() //letbook={ //"maintitle":"JavaScript", ////屬性名字有空格的,必須用字串表示 //"sub-title":"物件課程", ////屬性名字裡有連字元的,必須用字串表示 //"for":"學員", ////“for”是保留字,必須用引號 //author:{//該屬性的值是一個物件 //name:"aiai" //} //} //console.log(book);//{maintitle:"JavaScript",sub-title:"物件課程",for:"學員",author:{…}} //console.log(book.author.name);//aiai //呼叫物件裡面的物件屬性裡面的屬性就一直點點點下去 //方法二 //通過關鍵字new,後面跟隨一個函式呼叫。這裡的函式稱作建構函式,建構函式用以初始化一個新建立的物件 //JavaScript語言核心中的原始型別都包含內建建構函式 //內建物件 //letoj=newObject();//建立一個空物件,和{}一樣 //letdate=newDate();//建立一個表示當前時間的Date物件 //letarray=newArray();//建立一個空陣列,和[]一樣 //自定義物件 //functionboy(){//建構函式 //name="",//私有屬性(暫時不瞭解) ////this代表例項化後的物件 //this.sex="男", //this.age=25, //this.cook=function(){ //console.log("會做飯"); //} //} //letgb=newboy();//建立物件gb是一個物件,例項化物件 //console.log(gb.sex);//男 //gb.cook();//會做飯 //訪問物件: //方法一。點呼叫(.)上訴說過了 //方法二。中括號([]) //letoj={ //name:"xiao", //"1":1, //"name1":"dddd" //} //console.log(oj["1"]);//1 //console.log(oj["name1"]);//dddd //console.log(oj["name"]);//xiao ////當然不加引號的定義也可以用[]訪問 ////設定 //oj["name1"]="今天是星期日"; //console.log(oj["name1"]);//今天是星期日 //oj.name="heihei"; //console.log(oj.name);//heihei //物件常用操作 //刪除物件的屬性 //delete運運算元可以刪除物件的屬性 //letoj={ //a:"1", //b:{x:1} //} //letob=oj.b; //console.log(oj.b);//{x:1} //deleteoj.b; //console.log(oj.b);//undefined //console.log(ob);//{x:1} //delete只是斷開屬性和宿主物件的聯絡,而不會去操作記憶體中物件的屬性的值的存在與否 //判斷某個屬性是否存在於某個物件中 //可以通過in運運算元、hasOwnProperty()方法 //letoj={ //a:"1", //b:{x:1} //} //console.log("a"inoj);//true //console.log("c"inoj);//false //console.log(oj.hasOwnProperty("a"));//true //console.log(oj.hasOwnProperty("c"));//false //列舉物件屬性 //除了檢測物件的屬性是否存在,我們還會經常遍歷物件的屬性,通常使用for/in迴圈遍歷 //for/in迴圈可以在迴圈體中遍歷物件中所有可列舉的屬性(包括自有屬性和繼承的屬性) //物件繼承的內建方法不可列舉的,但在程式碼中給物件新增的屬性都是可列舉的 //for(oinoj){ //console.log(o);//ab //} //console.log(o.propertyIsEnumerable("toString"));//false //在JavaScript中物件的屬性有兩種,分別是資料屬性和訪問器屬性. ////資料屬性包含一個資料值的位置。在這個位置可以讀取和寫入值。資料屬性有4個描述其行為的特性 //程式設計師無法訪問到的 //[[Configurable]]:表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性。像前面例子中那樣直接在物件上定義的屬性,它們的這個特性預設值為true。 //[[Enumerable]]:表示能否通過for-in迴圈返回屬性。像前面例子中那樣直接在物件上定義的屬性,它們的這個特性預設值為true。 //[[Writable]]:表示能否修改屬性的值。像前面例子中那樣直接在物件上定義的屬性,它們的這個特性預設值為true。 //[[Value]]:包含這個屬性的資料值。讀取屬性值的時候,從這個位置讀;寫入屬性值的時候,把新值儲存在這個位置。這個特性的預設值為undefined //訪問器屬性允許使用者在賦值或取值都經過預先設定的函式,從而實現內部屬性的那一種特效結果 //get/set //獲取物件屬性的特性Object.getOwnPropertyDescriptor() //letoj={ //a:"1", //b:{x:1} //} //letc=Object.getOwnPropertyDescriptor(oj,"a"); //console.log(c);//{value:"1",writable:true,enumerable:true,configurable:true} ////設定物件屬性的特性Object.defineProperty() ////傳入要修改的物件、要建立或修改的屬性的名稱以及屬性描述符物件: //Object.defineProperty(oj,"a",{ //writable:false //}) //oj.a="333"; //letcg=Object.getOwnPropertyDescriptor(oj,"a"); //console.log(cg);//{value:"1",writable:false,enumerable:true,configurable:true} //console.log(oj.a);//1 </script>