JS面向對象之對象的屬性

1.屬性的設置和獲取

通過 . 操作符或者[ ]
區別:. 操作符取自身的屬性,[ ]可以是變量

var o = {};
o.name = "緣滅";
var aaa = "name";
console.log(o[aaa]);//緣滅

2.屬性的刪除

delete命令用於刪除對象的屬性,刪除成功後返回true。刪不掉原型上的
注意:刪除一個不存在的屬性,delete不報錯,而且返回true。因此,不能根據delete命令的結果,認定某個屬性是存在的。

var obj = { p: 1 };
delete obj.p // true
obj.p // undefined

3.屬性的檢測

in 或者 hasOwnProperty()方法

var o = {};
o.name = "緣滅";
console.log("name" in o);//true
console.log(o.hasOwnProperty("name"));//true

4.屬性的枚舉

for…in循環用來遍歷一個對象的全部屬性。包括原型上的屬性,而且順序是不確定的

var obj = {a: 1, b: 2, c: 3};
for (var i in obj) {
  console.log('鍵名:', i);//a b c
  console.log('鍵值:', obj[i]);//1 2 3
}

查看一個對象本身的所有屬性,也可以使用Object.keys方法。

var obj = {
  key1: 1,
  key2: 2
};
Object.keys(obj);// ['key1', 'key2']
}

5.ES中有兩種屬性:數據屬性和訪問器屬性

數據屬性:
[[Configurable]]:表示能否通過delete刪除屬性,默認true
[[Enumerable]]:表示能否通過for-in循環返回屬性,默認true
[[Writable]]:表示能否修改屬性的值,默認true
[[Value]]:包含這個屬性的數據值,默認undefined

修改默認屬性特性:Object.defineProperty(屬性所在的對象,屬性名,描述符對象)
var person = {};
Object.defineProperty(person, "name", {
    writable: false,     //只讀,不允許修改
    value: "Nicholas"
});
alert(person.name);//Nicholas
person.name = "Michael”;  //修改不成功,嚴格模式下會報錯
alert(person.name);//Nicholas

注意:一旦把屬性定義爲不可配置,就不能再把他變回可配置了。此時再調用除writable之外的特性都會報錯。

訪問器屬性:
[[Configurable]]:表示能否通過delete刪除屬性,默認true
[[Enumerable]]:表示能否通過for-in循環返回屬性,默認true
[[Get]]:讀取屬性時調用的函數,默認undefined
[[Set]]:寫入屬性時調用的函數,默認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;
        }
    }
});
book.year = 2006;
alert(book.edition); //3
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章