JS面向对象之对象属性的属性

ECMAScript的定义中,对象的属性有两种,一种是数据属性,另一种是访问器属性

我们知道JS中有基本数据类型和对象,对象中的属性也无外乎是这些类型,可是作为对象的属性,这些属性本身却也多了一些特殊的属性,而且属性种类的不同也会使属性的属性有些许的差别。下面就来聊聊对象属性的两种类别。


1.数据属性

这种属性包含有一个存放数据值的属性[[Value]],数据属性共有4个描述其行为的属性

  • [[Configurable]]:这个属性表示能否用delete语句删除属性,能否修改属性的属性。默认为true。
  • [[Enumerable]]:这个属性表示能否在使用for-in循环遍历对象属性时访问到该对象。默认为true。
  • [[Writable]]:这个属性表示能否修改属性的值。默认为true。
  • [[Value]]:这个属性用于存放属性的数据值。

var course = {
    name: "Operation System"
}

在这个例子中我创建了一个course对象,这个对象有一个name属性,name这个属性的Configuralbe, Enumerable和Writable属性都为true,而Value属性则为"Operation System"。

若是想要修改属性的属性,则必须使用Object.defineProperty()方法。该方法接受三个参数,第一个是属性所在对象,第二个是属性的名字,第三个是描述符对象(descriptor).描述符对象的属性只能是上述四种属性,但不一定全部都要有。例如

Object.defineProperty(course, "name", {
    value: Assembler Language,
    writable: false
})

course.name = "English"
alert(course.name) //Assembler Language

我们把course的name属性的writalbe属性改成了false,将value属性改为"Assembler Language",也就是说name属性此时已经变为一个只读属性,所以当我们再次修改course的name属性时会发现修改无效。(若是在严格模式下会导致错误) 如果我们把name属性的configurable属性也改成false的话,则对属性的所有属性进行修改都会导致报错(也不能把configurable改回true)

注:如果调用Object.defineProperty()方法来创建对象新属性,如果不指定,那么他的configuralbe, writable, enumerable属性全为false。


2.访问器属性

访问器属性不包括数据的值,但它包含有getter和setter函数(并不必须,只指定getter意味着只读,只指定setter意味只能写入)。同数据属性一样,访问器属性也包含四个描述其行为的属性。

  • [[Configurable]]:同上。
  • [[Enumerable]]:同上。
  • [[Get]]:在获取属性时调用的函数。
  • [[Set]]:在设置属性时调用的函数。

注:访问器属性不能被直接定义,必须使用Object.defineProperty()方法


var person = {
    _age: 20
};

Object.defineProperty(person, "age", {
    get: function(){
        return this._age;
    },
    set: function(){
        this._age++;
    }
})

在这个例子中,我创建了一个person对象,里面有一个_age属性并赋值为20,然后我们又通过Object.defineProperty()为person新定义了一个age属性,并定义了getter和setter函数。那么在每次对person对象的age属性进行修改时都会使_age自增。而在调用person.age时,也都返回的是person的_age属性。

猜你喜欢

转载自blog.csdn.net/hjc256/article/details/80825189