面向对象-001


title: 面向对象编程01

对象:无序属性的集合,其属性可以包含基本值,对象,或者函数。

理解对象

创建自定义对象的首选方法为对象字面量形式:

var person = {
    name: 'benjamin',
    age: 22,
    job: 'Front End Engineer',
    sayName: funtion(){
        alert(this.name);
    }
};

属性类型

JS中有两种属性:数据属性和访问器属性。

数据属性

数据属性包含一个数据值的位置。在这个位置可以读取和写入值。数据属性有4个描述其行为的特质。

如果需要修改属性的默认特性,必须使用Object.defineProperty()方法。此方法接受三个参数:属性所在的对象,属性名和一个描述符(descriptor)对象。描述符对象的属性必须是:configurable、enumerable、writable和value。

var person = {};
Object.defineProperty(person,'name',{
    writable: false,
    value: 'benjamin'
});
alert(person.name)  //'benjamin'
person.name = 'llf';
alert(person.name)  //'benjamin'

无法提供赋值形式修改'name'的值。该规则对于configurable同样适用。而且一旦将属性定义为不可配置后,就无法再将它变回可配置了。

访问器属性

访问器属性不包含数据值;它包含一对getter和setter函数。在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值;在写入访问器属性时,会调用setter函数并传入新值,这个函数负责如何处理数据。

访问器属性具有以下四个特性:

由于访问器属性不可以直接定义,必须使用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;
alert(book.edition);    //2

访问器属性通常用于设置一个属性的值会导致其他属性的变化

定义多个属性

利用Object.defineProperties()可以通过描述符一个定义多个属性。此方法接受两个对象参数:第一个对象为要添加和修改其属性的对象,第二个对象的属性与第一个对象中要添加或修改的属性一一对应。

var book = {};
Object.defineProperties(book,{
    _year: {
        writable: true,
        value: 2004
    },
    edition: {
        writable: true,
        value: 1
    },
    year: {
        get: function () {
            return this._year;
        }.
        set: function (newValue) {
            if (newValue > 2004) {
                this._year = newValue;
                this.edition += newValue - 2004;
            }
        }
    }
})

读取属性特性

利用Object.getOwnPropertyDescriptor()方法可以去属性的描述符。该方法接受两个参数:属性所在的对象名以及要读取其描述符的属性的名称。返回值是一个对象,如果是访问器属性。该对象的属性就有configurable、enumerable、get、set;如果是数据属性。那就是configurable、enumerable、writable、value。

var descriptor = Object.getOwnPropertyDescriptor(book,'_year');
alert(descriptor.value);    //2004
alert(descriptor.configurable);     //false

你可能感兴趣的:(面向对象-001)