JS进修笔记(第6章)(面向对象的程序设计之明白对象)

明白对象

1、建立自定义对象的两种要领:

(1)建立一个Object实例,然后再为它增加属性和要领。

var person = new Object();
    person.name = "Nicholas";
    person.age = 29;
    person.job = "Software Engineer";

    person.sayName = function() {
        alert(this.name);
    };

(2)用对象字面量语法建立 (属性名或要领名 : 值)

var person = {
    name : "Nicholas",
    age : 29,
    job : "Software Engineer",

    sayName : function() {
        alert (this.name);
    }
};

2、属性范例

ECMAScript中有两种属性:数据属性和接见器属性。
(1)数据属性:数据属性包括一个数据值的位置,在这个位置可以读取和写入值,数据属性有4个形貌其行动的特征:

1)[[Configurable]]:示意可以经由过程delect删除属性从而从新定义属性,可否修正属性的特征,或许可否把属性修正为接见器属性;
2)[[Enumerable]]:示意可否经由过程for-in轮回返回属性;
3)[[Writable]]:示意可否修正属性的值;
4)[[Value]]:包括这个属性的数据值。读取属性值的时刻,从这个位置读;写入属性的时刻,把新值保留在这个位置。
修正属性默许的特征,必需运用ECMAScript5的Object.defineProperty()要领。这个要领吸收三个参数:属性地点的对象、属性的名字和一个形貌符对象。个中,形貌符对象的属性必需是configurable、enumerable、writable和value。设置个中的一个或多个值,可以修正对应的特征值。

var person = {};
Object.defineProperty(person, "name", {
    writable : false,
    value : "Nicholas"
});

alert(person.name);  //"Nicholas"
person.name = "Greg";
alert(person.name); //"Nicholas"

本例中将name属性的write值设置为false示意只可读不可写。吧configurable设置为false,示意不能从对象中删除属性。一旦把属性定义为不可设置的,就不能再把它变回可设置了。
注重:在挪用Object.defineProperty()要领建立一个新的属性时,假如不指定,configurable、enumerable和writable特征的默许值都是false。
(2)接见器属性
接见器属性不包括数据值:它们包括一对儿getter和setter函数。在读取接见器属性时,会挪用getter函数,这个函数担任返回有用的值;在写入接见器属性时,会挪用setter函数并传入新值,这个函数担任决议怎样让处置惩罚数据。接见器属性有以下4个特征:

1)[[Configurable]]:示意可以经由过程delect删除属性从而从新定义属性,可否修正属性的特征,或许可否把属性修正为数据属性;
2)[[Enumerable]]:示意可否经由过程for-in轮回返回属性;
3)[[Get]]:在读取属性时挪用的函数。默许值为Undefined。
4)[[Set]]:在写入属性时挪用的函数。默许值为Undefined。

接见器属性不能直接定义,必需运用Object.defineProperty()来定义。

object.defineProperty(book,"year", {
    ger : function() {
        return this._year;
    },
    set : function(newValue) {
        if(newValue > 2004) {
            this._year = newValue;
            this.edition += newValue - 2004;
        }
    }
});
book.year = 2005;
alert(book.edition); //2 

_year前面的下划线是一种经常使用的暗号,用于示意只能经由过程对象要领接见的属性。

3、定义多个属性

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;
            }
        }
    }
});

以上代码在book对象上定义了两个数据属性(_year和edition)和一个接见器属性(year)。

4、读取属性的特征

Object.getOwnPropertyDescriptor()要领,可以去的给定属性的形貌符。这个要领吸收两个参数:属性地点的对象和要读取其形貌符的属性称号,返回值是一个对象。
假如是接见器属性,这个对象的属性有configurable、 enumerable、get和set;
假如是数据属性,这个对象的属性有configurable、enumerable、writable和value。

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;
            }
        }
    }
});

var descriptor = Object.getOwnPropertyDescriptor(book, "_year");
alert(descriptor.value);  //2004
alert(descriptor.configurable);  //false
alter(typeof descriptor.get);  //undefined

var descriptor = Object.getOwnPropertyDescriptor(book, "year");
alert(descriptor.value);   //undefined
alert(descriptor.enumerable);  //false
alert(typeof descriptor.get);  //"function"
    原文作者:皮卡丘丘丘
    原文地址: https://segmentfault.com/a/1190000018436000
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞