JavaScript 物件的建立和操作
阿新 • • 發佈:2020-07-12
<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>