成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

JavaScript 數(shù)據(jù)屬性和訪問(wèn)器屬性

LucasTwilight / 1401人閱讀

摘要:數(shù)據(jù)屬性數(shù)據(jù)屬性有個(gè)描述其行為的特性表示能否通過(guò)刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問(wèn)器屬性。在讀取訪問(wèn)器屬性時(shí),會(huì)調(diào)用函數(shù),在寫(xiě)入訪問(wèn)器屬性時(shí),又會(huì)調(diào)用函數(shù)并傳入新值。

JavaScript 數(shù)據(jù)屬性和訪問(wèn)器屬性

原文鏈接

一個(gè)例子

先看代碼:

var obj = {name:"percy"};
console.log(obj.name);    // percy
obj.name = "zyj";
console.log(obj.name);    // zyj

// 這里借 Math 對(duì)象來(lái)舉例
// 首先說(shuō)明一下, Math 對(duì)象和上面定義的 obj 對(duì)象都只是 Object 對(duì)象的一個(gè)實(shí)例
console.log(Math.PI);    // 3.1415926...
Math.PI = 1234;
console.log(Math.PI);    // 3.1415926...

看到了嗎?同樣是 Object 的實(shí)例,obj 對(duì)象的屬性卻可以被改寫(xiě),而 Math 對(duì)象的屬性去不能被改寫(xiě)。好,讓我們來(lái)碼一行,從而讓 obj 對(duì)象的屬性也不能被改寫(xiě):

var obj = {name:"percy"};
console.log(obj.name);    // percy

Object.defineProperty(obj,"name",{writable:false});

obj.name = "zyj";
console.log(obj.name);    // percy

看到了嗎,這其中另有玄機(jī),接下來(lái)就引入了我們的主角:對(duì)象的數(shù)據(jù)屬性訪問(wèn)器屬性。

為了表示特性是內(nèi)部值,規(guī)范(ECMA-262)就把它們放到了兩對(duì)兒方括號(hào)里了,例如 [[Enumerable]]。

數(shù)據(jù)屬性(Data Properties)

數(shù)據(jù)屬性有4個(gè)描述其行為的特性:

[[Configurable]] : 表示能否通過(guò) delete 刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問(wèn)器屬性。

[[Enumerable]] : 表示能否通過(guò) for-in 循環(huán)返回屬性。

[[Writable]] : 表示能否修改屬性的值。

[[Value]] : 包含這個(gè)屬性的數(shù)據(jù)值。讀取屬性值的時(shí)候,從這個(gè)位置讀;寫(xiě)入屬性值時(shí),把新值保存在這個(gè)位置。默認(rèn)值是 undefined。

像這樣(var obj = new Object(); obj.name = "percy";)或者像通過(guò)對(duì)象字面量(var obj = {name: "percy"};)直接在對(duì)象上定義的屬性,它們的 [[Configurable]]、[[Enumerable]] 和 [[Writable]] 特性默認(rèn)都被設(shè)置為 true,而 [[Value]] 特性被設(shè)置為指定的值。

這里注意一下這個(gè)(可以先跳過(guò),完了再看):

var person = {};   // 新建一個(gè)空對(duì)象
Object.defineProperty(person,"name",{
  value: "percy"
});
console.log(Object.getOwnPropertyDescriptor(person,"name"));
// 打?。篛bject {value: "percy", writable: false, enumerable: false, configurable: false}

沒(méi)有按上面的2種方法為對(duì)象添加屬性,而直接通過(guò) Object.defineProperty() 為對(duì)象添加屬性以及值,這種情況下,這個(gè)對(duì)象的這個(gè)屬性的另外3個(gè)特性的默認(rèn)值都是 false。

要修改屬性默認(rèn)的特性,必須使用 ECMAScript 的 Object.defineProperty() 方法。

Object.defineProperty( obj, prop, descriptor)

obj:需要定義屬性的對(duì)象。

prop:需定義或修改的屬性的名字。

descriptor:一個(gè)包含設(shè)置特性的對(duì)象

var person = {name: "percy"};
Object.defineProperty(person,"name",{
  writable: false
});
console.log(person.name);  // percy
person.name = "zyj";
console.log(person.name);  // percy

for(let prop in person){
  console.log(prop + " : " + person[prop]);
}                   // name : percy 
Object.defineProperty(person,"name",{
  enumerable: false
});
for(let prop in person){
  console.log(prop + " : " + person[prop]);
}                   // 什么也沒(méi)打印

Object.defineProperty(person,"name",{
  configurable: false
});
Object.defineProperty(person,"name",{
  configurable: true
}); // 報(bào)錯(cuò):TypeError: Cannot redefine property: name(…)

// 一旦把屬性定義為不可配置的,那么就再也不能把屬性定義回可配置的了。
訪問(wèn)器屬性(Accessor Properties)

訪問(wèn)器屬性不包含數(shù)據(jù)值,它們包含一對(duì)兒 gettersetter 函數(shù)(不過(guò),這兩個(gè)函數(shù)都不是必需的)。在讀取訪問(wèn)器屬性時(shí),會(huì)調(diào)用 getter 函數(shù),在寫(xiě)入訪問(wèn)器屬性時(shí),又會(huì)調(diào)用 setter 函數(shù)并傳入新值。

訪問(wèn)器屬性有如下4個(gè)特性:

[[Configurable]]:表示能否通過(guò) delete 刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為數(shù)據(jù)屬性。

[[Enumerable]]:表示能否通過(guò) for-in 循環(huán)返回屬性。

[[Get]]:在讀取屬性時(shí)調(diào)用的函數(shù)。默認(rèn)值為 undefined。

[[Set]]:在寫(xiě)入屬性時(shí)調(diào)用的函數(shù)。默認(rèn)值為 undefined。

訪問(wèn)器屬性不能直接定義,必須使用 Object.defineProperty() 來(lái)定義。

var book = {
    _year : 2004,
    edition : 1
};
Object.defineProperty(book,"year",{ 
    get : function () {
        alert(this._year);
    },
    set : function (newValue) {
        if (newValue > 2004) {
            this._year = newValue;
            this.edition += newValue - 2004;
        }
    }
});
book.year;      // 彈出窗口,顯示 2004
book.year = 2005;
console.log(book.edition);   // 2

要是上面的代碼有不懂得地方,參看這里,JavaScript理解對(duì)象:屬性類(lèi)型(推薦)

定義多個(gè)屬性

Object.defineProperties(obj, props)

var obj = {};
Object.defineProperties(obj, {
  "property1": {
    value: true,
    writable: true
  },
  "property2": {
    value: "Hello",
    writable: false
  }
  // 等等.
});

console.log(obj); // Object {property1: true, property2: "Hello"}
讀取屬性的特性

Object.getOwnPropertyDescriptor(obj, prop) 返回指定對(duì)象上一個(gè)自有屬性對(duì)應(yīng)的屬性描述符。(自有屬性指的是直接賦予該對(duì)象的屬性,不需要從原型鏈上進(jìn)行查找的屬性)

var girl = {name: "zyj"};
console.log(Object.getOwnPropertyDescriptor(girl,"name"));
// Object {value: "zyj", writable: true, enumerable: true, configurable: true}

Object.defineProperties(girl,{
  name:{
    writable: false
  },
  age:{
    writable: true,
    value: 22
  }
});

console.log(Object.getOwnPropertyDescriptor(girl,"name"));
// Object {value: "zyj", writable: false, enumerable: true, configurable: true}
console.log(Object.getOwnPropertyDescriptor(girl,"age"));
// Object {value: 22, writable: true, enumerable: false, configurable: false}

var descriptor = Object.getOwnPropertyDescriptor(girl,"age");
console.log(descriptor.value);         // 22
console.log(descriptor.configurable);  // false
console.log(descriptor.writable);      // true
console.log(descriptor.get);           // undefined
console.log(descriptor.set);           // undefined
摘抄自文末的鏈接

A property is a name (string identifier) associated with a property descriptor.

As of ECMAScript 5, three property types are available:

Internal Properties

Data properties

Accessor properties

參考資料

【書(shū)】《JavaScript 高級(jí)程序設(shè)計(jì)(第三版)》

【文章】Object: Data Property and Accessor Property(推薦)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/80297.html

相關(guān)文章

  • 深入理解JavaScript中的屬性特性

    摘要:深入理解中的屬性和特性中屬性和特性是完全不同的兩個(gè)概念,這里我將根據(jù)自己所學(xué),來(lái)深入理解中的屬性和特性。其中第三個(gè)參數(shù)描述符對(duì)象是對(duì)象字面量的方法創(chuàng)建的,里面的屬性和屬性值實(shí)際上保存的是要修改的特性和特性值。 深入理解JavaScript中的屬性和特性   JavaScript中屬性和特性是完全不同的兩個(gè)概念,這里我將根據(jù)自己所學(xué),來(lái)深入理解JavaScript中的屬性和特性。   主...

    VPointer 評(píng)論0 收藏0
  • javascript 面向?qū)ο蟀鎵K之對(duì)象屬性

    摘要:上一篇面向?qū)ο蟀鎵K之理解對(duì)象下一篇面向?qū)ο蟀鎵K之定義多個(gè)對(duì)象屬性以及讀取屬性特性 這是 javascript 面向?qū)ο蟀鎵K的第二篇文章,主要講解的是對(duì)象的屬性,首先創(chuàng)建一個(gè)對(duì)象: var person = { name: Nicholas, age: 29, job: Software Engineer, sayName: function () { conso...

    lolomaco 評(píng)論0 收藏0
  • 重溫JS基礎(chǔ)--JS中的對(duì)象屬性

    摘要:數(shù)據(jù)屬性有個(gè)描述其行為的特性表示能否通過(guò)刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問(wèn)器屬性??偨Y(jié)一波關(guān)于這些內(nèi)容主要講的就是在的對(duì)象屬性可以分為兩類(lèi),一類(lèi)就是數(shù)據(jù)屬性,一類(lèi)就是訪問(wèn)器屬性。 前言 面向?qū)ο蟮恼Z(yǔ)言都有一個(gè)類(lèi)的概念,通過(guò)類(lèi)可以創(chuàng)建任意多個(gè)具有相同屬性和方法的對(duì)象。 JavaScript中把對(duì)象定義為無(wú)序?qū)傩缘募希瑢傩钥梢园局?,?duì)象或者函數(shù)...

    jerryloveemily 評(píng)論0 收藏0
  • Javascript面向?qū)ο蟮某绦蛟O(shè)計(jì)_理解對(duì)象

    摘要:面向?qū)ο蟮某绦蛟O(shè)計(jì)理解對(duì)象前言最近在細(xì)讀高級(jí)程序設(shè)計(jì),對(duì)于我而言,中文版,書(shū)中很多地方翻譯的差強(qiáng)人意,所以用自己所理解的,嘗試解讀下??偨Y(jié)如果英語(yǔ)水平足夠好的話,建議看英文原版書(shū)籍或者國(guó)外大師的博客。 JS面向?qū)ο蟮某绦蛟O(shè)計(jì)_理解對(duì)象 前言:最近在細(xì)讀Javascript高級(jí)程序設(shè)計(jì),對(duì)于我而言,中文版,書(shū)中很多地方翻譯的差強(qiáng)人意,所以用自己所理解的,嘗試解讀下。 如有紕漏或錯(cuò)誤,會(huì)非...

    劉厚水 評(píng)論0 收藏0
  • 關(guān)于JavaScript對(duì)象,你所不知道的事(二)- 再說(shuō)屬性

    摘要:但好在還給我們提供了一個(gè)方法,每一個(gè)對(duì)象都有這樣一個(gè)方法,專(zhuān)門(mén)用來(lái)判斷某個(gè)屬性是否是該對(duì)象的私有屬性。如果你想要用對(duì)象字面形式,你只能在創(chuàng)建對(duì)象時(shí)定義訪問(wèn)器屬性。在中,我們使用凍結(jié)一個(gè)對(duì)象,并且使用來(lái)判斷一個(gè)對(duì)象是否被凍結(jié)。 說(shuō)完了對(duì)象那些不常用的冷知識(shí),是時(shí)候來(lái)看看JavaScript中對(duì)象屬性有哪些有意思的東西了。 不出你所料,對(duì)象屬性自然也有其相應(yīng)的特征屬性,但是這個(gè)話題有點(diǎn)復(fù)雜...

    Richard_Gao 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<