面向对象的程序设计之理解对象

栏目: 后端 · 前端 · 发布时间: 5年前

内容简介:1、创建自定义对象的两种方法:(1)创建一个Object实例,然后再为它添加属性和方法。(2)用对象字面量语法创建

理解对象

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个描述其行为的特性:

修改属性默认的特性 ,必须使用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个特性:

  • [[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"

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Effective JavaScript

Effective JavaScript

赫尔曼 (David Herman) / 黄博文、喻杨 / 机械工业出版社 / 2014-1-1 / CNY 49.00

Effective 系列丛书经典著作,亚马逊五星级畅销书,Ecma 的JavaScript 标准化委员会著名专家撰写,JavaScript 语言之父、Mozilla CTO —— Brendan Eich 作序鼎力推荐!作者凭借多年标准化委员会工作和实践经验,深刻辨析JavaScript 的内部运作机制、特性、陷阱和编程最佳实践,将它们高度浓缩为极具实践指导意义的 68 条精华建议。 本书共......一起来看看 《Effective JavaScript》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具