高程第六章--面向对象程序设计--属性类型

ES有两种属性类型:数据属性和访问器属性。

一、数据属性4个描述其行为的特性。

1:[[Configurable]]:表示能否通过delete删除属性从而重新定义属性。

2: [[Enumerable]]:表示能否通过for-in循环返回属性

3: [[Writable]]:表示能否修改属性的值

4:[[Value]]:包含这个属性的属性值

要修改属性默认的特性,必须使用ES5的defineProperty()方法

//"use strict";
var person = {};
Object.defineProperty(person,'name',{
    writable:false,//表示能否修改属性的值为true的话可以修改  默认false
    value:"Nicholas"
});
console.log(person.name);//Nicholas
person.name = "Grey";//严格模式下会报错
console.log(person.name);//Nicholas true的情况下"Grey"
// "use strict";
var person = {};
Object.defineProperty(person,'name',{
    configurable:true,//表示不能删除对象中的属性  默认为true
    value:"Nicholas"
});
console.log(person.name);//Nicholas
delete person.name;//严格模式下会报错
console.log(person.name);//Nicholas

//"use strict";
var person = {};
Object.defineProperty(person,'name',{
    configurable:false,//表示不能删除对象中的属性
    value:"Nicholas"
});
//抛出错误
Object.defineProperty(person,'name',{
    configurable:true,//一旦把属性定义为不可配置,就不能再把他变回可配置
    value:"Nicholas"
});


 

二:访问器属性 不包含数据值,他们包含一对getter和setter函数 但是不是必须的

1:[[Configurable]]:表示能否通过delete删除属性从而重新定义属性。

2: [[Enumerable]]:表示能否通过for-in循环返回属性

3: [[Get]]:在读取属性时调用的函数。默认为undefined。

4: [[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 = 2005;
console.log(book.edition);//2

_year前面的下划线是一种常用的记号,用于表示对象方法访问的属性。而访问器属性year则包含一个getter和setter的函数。getter函数返回_year的值。而setter函数通过计算来确定正确的版本。

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");//数据属性
console.log(descriptor.value);//2004
console.log(descriptor.configurable);//false
console.log(descriptor.get);//underfined

var descriptor = Object.getOwnPropertyDescriptor(book,"year");//访问器属性
console.log(descriptor.value);//underfined
console.log(descriptor.enumerable);//false
console.log(descriptor.get);//[Function: get]
原文地址:https://www.cnblogs.com/mr-pz/p/5906930.html