我是靠谱客的博主 优秀月亮,最近开发中收集的这篇文章主要介绍说说对 JavaScript 对象的理解1 数据属性2 访问器属性3 定义多个属性4 读取属性的特性,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

创建自定义对象的方式有两种:
* 创建一个 Object 实例,然后再为它添加属性和方法:

//创建 Object 的实例
var person = new Object();
person.name = "deniro";
person.age = 29;
person.job = "Software Engineer";

person.sayName = function () {
    console.log(this.name);
};
  • 对象字面量方式(已成为首选模式):
//对象字面量语法
var person = {
    name: "deniro",
    age: 29,
    job: "Software Engineer",
    sayName: function () {
        console.log(this.name);
    }
}

ECMA-262 第 5 版,定义了只有内部才能使用到的属性,这些属性是用于 JavaScript 引擎的实现上,因此 JavaScirpt 不能直接访问到它们,它们一般用两对方括号表示,比如[[Enumerable]]。

1 数据属性

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

特性说明默认值
[[Configurable]]能否通过 delete 删除属性true
[[Enumerable]]能否通过 for-in 循环返回属性true
[[Writable]]能否修改属性的值true
[[Value]]包含这个属性的数据值undefined
var person = {
    name: "deniro"
}

上面这个例子中的 name 属性的 [[Value]] 被设定为 deniro,其他值设置为 true。

要修改属性的默认特性,必须使用 ECMAScript 5 的 Object.defineProperty() 方法。它接受三个参数:属性所在的对象,属性名以及描述符对象。其中的描述符对象必须是 configurable、enumerable、writable 和 value:

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

console.log(person.name);//deniro
person.name = "Lily";
console.log(person.name);//deniro

一个属性被设置为不可修改后,如果尝试为它设置新值,在非严格模式下,会被忽略;在严格模式下,会抛出错误。

把属性设置为不可配置:

var person = {};
Object.defineProperty(person, "name", {
    configurable: false,
    value: "deniro"
});
console.log(person.name);//deniro
delete person.name;
console.log(person.name);//deniro

configurable 设置为 false,表示不能从对象中删除属性。如果这时对这个属性调用 delete,在非严格模式下,会被忽略;在严格模式下,会抛出错误。

一旦把属性定义为不可配置(configurable 设置为 false),就不能再把它定义为可配置的了:

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

//抛错
Object.defineProperty(person, "name", {
    configurable: true,
    value: "deniro"
});

在调用 Object.defineProperty() 方法时,如果不指定,configurable、enumerable、writable 会默认为 false。多数情况下,没有必要使用 Object.defineProperty() 方法,但理解这些概念有助于对于理解 JavaScript 对象。


注意: IE8 是第一个实现 Object.defineProperty() 的浏览器。然而这个版本的实现存在很多限制。因为实现的不彻底,所以建议大家不要在 IE8 中使用 Object.defineProperty()。


2 访问器属性

访问器是一对 getter 和 setter 函数(非必须)。使用 getter 读取访问器属性,使用 setter 写入访问器属性。它有 4 个特性:

特性说明默认值
[[Configurable]]能否通过 delete 删除属性true
[[Enumerable]]能否通过 for-in 循环返回属性true
[[Get]]在读取属性时调用的函数undefined
[[Set]]在写入属性时调用的函数undefined

访问器属性必须使用 Object.defineProperty() 来定义:

var book = {
    _year: 2016,
    edition: 1
};

Object.defineProperty(book, "year", {
    get: function () {
        return this._year;
    },
    set: function (newValue) {
        if (newValue > 2004) {
            this._year = newValue;
            this.edition += newValue - 2016;
        }
    }
});

book.year = 2017;
console.log(book.edition);//2

_year 前面的下划线表示只能通过对象方法访问的属性。

使用访问器的常见方式是,设置一个属性的值会导致其他属性值发生变化。

只指定 getter 表示属性为只读。在严格模式下,尝试写入会抛错。只指定 setter 表示属性为只写。在非严格模式下,返回 undefined;在严格模式下,尝试读取会抛错。

在不支持 ECMAScript 5 的浏览器中,一般有两个非标准方法:__defineGetter__()__defineSetter__(),这两个方法会是由 Firefox 定义的,后来 Safari 3、Chrome 1、Opera 9.5 也给出了相同的实现。

下面用遗留的方法重写了之前的例子:

var book = {
    _year: 2016,
    edition: 1
};

book.__defineGetter__("year", function () {
    return this._year;
});

book.__defineSetter__("year", function (newValue) {
    if (newValue > 2004) {
        this._year = newValue;
        this.edition += newValue - 2016;
    }
});


book.year = 2017;
console.log(book.edition);//2

注意:在不支持 Object.defineProperty() 方法的浏览器中,不能修改 [[Configurable]] 和 [[Enumerable]]。


3 定义多个属性

ECMAScript 5 定义的 Object.defineProperties(),可以一次定义多个属性。它接受两个参数(要添加和修改其属性的对象、定义的属性):

var book = {};

Object.defineProperties(book, {
    _year: {
        value: 2016
    },
    edition: {
        value: 1
    },
    year: {
        get: function () {
            return this._year;
        },

        set: function () {
            if (newValue > 2016) {
                this._year = newValue;
                this.edition += newValue - 2016;
            }
        }
    }
});

4 读取属性的特性

ECMAScript 5 定义的 Object.getOwnPropertyDescriptor() ,会读取属性的特性。它接受两个参数(属性所在的对象、要读取描述符的属性名称),返回值是对象,可能是访问器属性,也可能是数据属性:

var book = {};

Object.defineProperties(book, {
    _year: {
        value: 2017
    },

    edition: {
        value: 1
    },

    year: {
        get: function () {
            return this._year;
        },
        set: function (newValue) {
            if (newValue > 2017) {
                this._year = newValue;
                this.edition += newValue - 2017;
            }
        }
    }
});

var descriptor = Object.getOwnPropertyDescriptor(book, "_year");
console.log(descriptor.value);//2017
console.log(descriptor.configurable);//false
console.log(typeof descriptor.get);//undefined

var descriptor = Object.getOwnPropertyDescriptor(book, "year");
console.log(descriptor.value);//undefined
console.log(descriptor.configurable);//false
console.log(typeof descriptor.get);//function

在支持 ECMAScript 5 版本的 JavaScript 中,可以针对任何对象(包括 DOM 和 BOM),使用 Object.getOwnPropertyDescriptor 方法。

最后

以上就是优秀月亮为你收集整理的说说对 JavaScript 对象的理解1 数据属性2 访问器属性3 定义多个属性4 读取属性的特性的全部内容,希望文章能够帮你解决说说对 JavaScript 对象的理解1 数据属性2 访问器属性3 定义多个属性4 读取属性的特性所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(74)

评论列表共有 0 条评论

立即
投稿
返回
顶部