步遙——面向?qū)ο笤O(shè)計程序

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)是由這些屬性描述進行修飾的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容