1:什么是對象??
對象是無序?qū)傩缘募?,其屬性可以包含基本值,對象或者函?shù),可以把對象想象成散列表,一組名值對,其中值可以是數(shù)據(jù)或函數(shù),名是字符串。
2:如何創(chuàng)建對象?
創(chuàng)建一個對象:
var person = {
name:'Nicholas',
age:'29',
job:'Software English',
sayName:function(){
? ? ? ? ?alert(this.name)
? ? ? ?}
}
2.1:認識對象中的屬性的特征:
2.1.1 管理數(shù)據(jù)的屬性:
[[Configurable]]:true//能通過delete刪除屬性并重新定義;
[[Enumerable]]:true//能通過for-in循環(huán)訪問的屬性
[[Writable]]:true//能修改屬性的值
[[Value]]:true//屬性的值
如果想修改對象的屬性的特性,需要使用下面方法:
Object.defineProperty(person,'name',{
writable:false,//不能修改屬性值
value:'Nicholas'
})
2.1.2 管理訪問的屬性:? ? ? ??
[[Configurable]]:true//表示能夠通過delete刪除屬性從而重新定義屬性,能夠修改屬性的特性。
[[Enumerable]]:true//表示能夠通過for-in循環(huán)訪問的屬性
[[Get]]:在讀取屬性時調(diào)用的函數(shù),記住了是一個函數(shù),這個函數(shù)一般返回一個值,即要訪問的屬性的值
[[Set]]:在寫入屬性時調(diào)用的函數(shù),記住也是一個函數(shù)
以上的訪問器屬性也必須通過Object.defineProperty()定義
練習(xí)一下:
let?person?=?{
????_name:'Nicholas',
????age:29,
????job:'Software?English',
????sayName:function(){
????????alert(this._name)
????}
}
Object.defineProperty(person,'name',{
????get:function(){
????????return?this._name;
????},
????set:function(value){
?????????this._name?=?value;
????}
})
//?person.name?=?'aaa'
console.log(person.name)
person中沒有最初沒有定義name屬性,但是使用Object.defineProperty()方法定義了對name的訪問屬性,就是在訪問的name的時候,會根據(jù)get和set方法的定義去獲取或更改name的值,一開始沒有定義name屬性但是訪問name時會由get方法,返回_name的值,更改name的屬性,會利用set方法,變通的修改_name的值,好像一種障眼法。讀取和修改的屬性name其實都是另一個屬性_name的值,而name這個屬性有點像一個‘傀儡’,真正的核心屬性竟然是_name。
當(dāng)要定義多個屬性時:就要使用Object.definePropertyies(person,{
_year:{//數(shù)據(jù)屬性
? ? ? value:2020
},
name:{//數(shù)據(jù)屬性
? ? ? value:'Nicholas'
},
edition:{//訪問器屬性
get:function(){return this._year},
set:function(value){this._year = value}
}
})
3:以上是給對象屬性設(shè)置屬性,讀取設(shè)置的屬性可以使用:Object.getOwnPropertyDescriptor(person,'name'),該值返回一個對象,對象中包含了數(shù)據(jù)屬性和訪問屬性,依次讀取對象中的屬性設(shè)置:
let descriptor = Object.getOwnPropertyDescriptor(person,,'name')
descriptor.configurable// 讀取設(shè)置的configurable屬性,查看下name屬性是否可以通過delete刪除,是否可修改
以上認識了什么是對象,對象怎么建立,和對象中的屬性可以怎么管理,有什么特性。就讓我們更深入的理解了對象的含義。就像對象的數(shù)據(jù)屬性,不是每個屬性都是千篇一律的用來存一下數(shù)據(jù)值,你可以通過修改writable屬性,不準(zhǔn)修改它,也不是所有的屬性值都能訪問的,如果你把enumerable屬性設(shè)置為false,那這個值你在for-in循環(huán)遍歷時就訪問不到了;抑或是有個屬性值不想被外界直接訪問到,可以通過定義一個‘傀儡’屬性,讓外界間接的訪問到該屬性等等。
從有關(guān)屬性的屬性描述中,我們更能了解到,組成一個對象的不僅僅是只有屬性成員,還有對每個成員屬性的設(shè)置,猶如洋蔥一般,撥開對象的外衣,內(nèi)部的結(jié)構(gòu)是由這些屬性描述進行修飾的。