【javascript】理解對象屬性

ECMAScript 中沒有類的概念查近,因此它的對象也與基于類的語言中的對象有所不同僧家。

  • 創(chuàng)建自定義對象的最簡單方式就是創(chuàng)建一個Object 的實(shí)例,然后再為它添加屬性和方法
var person = new Object();
person.name = "Nicholas";
person.age = 29;
person.job = "Software Engineer";
person.sayName = function(){
    alert(this.name);
};
  • 對象字面量成為創(chuàng)建這種對象的首選模式
var person = {
    name: "Nicholas",
    age: 29,
    job: "Software Engineer",
    sayName: function(){
        alert(this.name);
    }
};

屬性類型

  • ECMAScript 中有兩種屬性:數(shù)據(jù)屬性和訪問器屬性。

1乎婿、數(shù)據(jù)屬性

數(shù)據(jù)屬性包含一個數(shù)據(jù)值的位置肠阱。在這個位置可以讀取和寫入值票唆。數(shù)據(jù)屬性有4個描述其行為的特性。

  • [[Configurable]]:表示能否通過delete刪除屬性從而重新定義屬性屹徘,能否修改屬性的特
    性走趋,或者能否把屬性修改為訪問器屬性。直接在對象上定義的屬性缘回,它們的這個特性默認(rèn)值為true吆视。
  • [Enumerable]]:表示能否通過for-in 循環(huán)返回屬性。直接在對象上定義的屬性酥宴,它們的
    這個特性默認(rèn)值為true啦吧。
  • [[Writable]]:表示能否修改屬性的值。直接在對象上定義的屬性拙寡,它們的這個特性默認(rèn)值為true授滓。
  • [[Value]]:包含這個屬性的數(shù)據(jù)值。讀取屬性值的時候肆糕,從這個位置讀般堆;寫入屬性值的時候,把新值保存在這個位置诚啃。這個特性的默認(rèn)值為undefined淮摔。
  • 要修改屬性默認(rèn)的特性,必須使用ECMAScript 5的Object.defineProperty()方法始赎。這個方法接收三個參數(shù):屬性所在的對象和橙、屬性的名字和一個描述符對象仔燕。其中,描述符(descriptor)對象的屬性必須是:configurable魔招、enumerable晰搀、writable 和value。設(shè)置其中的一或多個值办斑,可以修改對應(yīng)的特性值外恕。
var person = {};
Object.defineProperty(person, "name", {
    writable: false,
    value: "Nicholas"
});
alert(person.name); //"Nicholas"
person.name = "Greg";
alert(person.name); //"Nicholas"
var person = {};
Object.defineProperty(person, "name", {
    configurable: false,
    value: "Nicholas"
});
alert(person.name); //"Nicholas"
delete person.name;
alert(person.name); //"Nicholas"
//把configurable 設(shè)置為false,表示不能從對象中刪除屬性乡翅。如果對這個屬性調(diào)用delete鳞疲,則在非嚴(yán)格模式下什么也不會發(fā)生,而在嚴(yán)格模式下會導(dǎo)致錯誤峦朗。
  • 一旦把屬性定義為不可配置的建丧,就不能再把它變回可配置了。此時波势,再調(diào)用Object.defineProperty()方法修改除writable 之外的特性翎朱,都會導(dǎo)致錯誤
var person = {};
Object.defineProperty(person, "name", {
    configurable: false,
    value: "Nicholas"
});
//拋出錯誤
Object.defineProperty(person, "name", {
    configurable: true,
    value: "Nicholas"
});
  • 在調(diào)用Object.defineProperty()方法時,如果不指定尺铣,configurable拴曲、enumerable 和
    writable 特性的默認(rèn)值都是false。

2凛忿、訪問器屬性

訪問器屬性不包含數(shù)據(jù)值澈灼,它們包含一對兒getter和setter函數(shù)(非必需),在讀取訪問器屬性時店溢,會調(diào)用getter 函數(shù)叁熔,這個函數(shù)負(fù)責(zé)返回有效的值;在寫入訪問器屬性時床牧,會調(diào)用setter 函數(shù)并傳入新值荣回,這個函數(shù)負(fù)責(zé)決定如何處理數(shù)據(jù)。

  • [[Configurable]]:表示能否通過delete刪除屬性從而重新定義屬性戈咳,能否修改屬性的特
    性心软,或者能否把屬性修改為數(shù)據(jù)屬性。對于直接在對象上定義的屬性著蛙,這個特性的默認(rèn)值為
    true删铃。
  • [[Enumerable]]:表示能否通過for-in循環(huán)返回屬性。對于直接在對象上定義的屬性踏堡,這
    個特性的默認(rèn)值為true猎唁。
  • [[Get]]:在讀取屬性時調(diào)用的函數(shù)。默認(rèn)值為undefined顷蟆。
  • [[Set]]:在寫入屬性時調(diào)用的函數(shù)胖秒。默認(rèn)值為undefined缎患。
  • 訪問器屬性不能直接定義,必須使用Object.defineProperty()來定義
var book = {
    _year: 2004,
    edition: 1
};
Object.defineProperty(book, "year", {
    get: function(){
        return this._year;
    },
    set: function(newValue){
        if (newValue > 2004) {
            this._year = newValue;
            this.edition += newValue - 2004;
        }
    }
});
alert(book.year); //2004
book.year = 2005;
alert(book.edition); //2

定義多個屬性

  • 由于為對象定義多個屬性的可能性很大阎肝,ECMAScript5又定義了一個Object.defineProperties()方法。
  • 利用這個方法可以通過描述符一次定義多個屬性肮街。這個方法接收兩個對象參數(shù):第一個對象是要添加和修改其屬性的對象风题,第二個對象的屬性與第一個對象中要添加或修改的屬性一一對應(yīng)
var book = {};
Object.defineProperties(book, {
    _year: {
        value: 2004
    },
    edition: {
        value: 1
    },
    year: {
        get: function(){
            return this._year;
        },
        set: function(newValue){
            if (newValue > 2004) {
                this._year = newValue;
                this.edition += newValue - 2004;
            }
        }
    }
});

讀取屬性的特性

  • 使用ECMAScript 5 的Object.getOwnPropertyDescriptor()方法,可以取得給定屬性的描述符嫉父。
  • 這個方法接收兩個參數(shù):屬性所在的對象和要讀取其描述符的屬性名稱沛硅。返回值是一個對象。
  • 如果是訪問器屬性绕辖,這個對象的屬性有configurable摇肌、enumerable、get 和set仪际。
  • 如果是數(shù)據(jù)屬性围小,這個對象的屬性有configurable、enumerable树碱、writable 和value肯适。
var book = {};
Object.defineProperties(book, {
    _year: {
        value: 2004
    },
    edition: {
        value: 1
    },
    year: {
        get: function(){
            return this._year;
        },
        set: function(newValue){
            if (newValue > 2004) {
                this._year = newValue;
                this.edition += newValue - 2004;
            }
        }
    }
});
var descriptor = Object.getOwnPropertyDescriptor(book, "_year");
alert(descriptor.value); //2004
alert(descriptor.configurable); //false
alert(typeof descriptor.get); //"undefined"

var descriptor = Object.getOwnPropertyDescriptor(book, "year");
alert(descriptor.value); //undefined
alert(descriptor.enumerable); //false
alert(typeof descriptor.get); //"function"
  • 在JavaScript 中,可以針對任何對象——包括 DOM 和BOM 對象成榜,使用Object.getOwnPropertyDescriptor()方法框舔。
  • 支持這個方法的瀏覽器有IE9+、Firefox 4+赎婚、Safari 5+刘绣、Opera 12+和Chrome。
好好學(xué)習(xí)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挣输,一起剝皮案震驚了整個濱河市纬凤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌歧焦,老刑警劉巖移斩,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異绢馍,居然都是意外死亡向瓷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門舰涌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猖任,“玉大人,你說我怎么就攤上這事瓷耙≈焯桑” “怎么了刁赖?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長长搀。 經(jīng)常有香客問我宇弛,道長,這世上最難降的妖魔是什么源请? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任枪芒,我火速辦了婚禮,結(jié)果婚禮上谁尸,老公的妹妹穿的比我還像新娘舅踪。我一直安慰自己,他們只是感情好良蛮,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布抽碌。 她就那樣靜靜地躺著,像睡著了一般决瞳。 火紅的嫁衣襯著肌膚如雪货徙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天瞒斩,我揣著相機(jī)與錄音破婆,去河邊找鬼。 笑死胸囱,一個胖子當(dāng)著我的面吹牛祷舀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播烹笔,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼裳扯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谤职?” 一聲冷哼從身側(cè)響起饰豺,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎允蜈,沒想到半個月后冤吨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饶套,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年漩蟆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妓蛮。...
    茶點(diǎn)故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡怠李,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捺癞,我是刑警寧澤夷蚊,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站髓介,受9級特大地震影響惕鼓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜唐础,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一呜笑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧彻犁,春花似錦、人聲如沸凰慈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽微谓。三九已至森篷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間豺型,已是汗流浹背仲智。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留姻氨,地道東北人钓辆。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像肴焊,于是被迫代替她去往敵國和親前联。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評論 2 359