`
MirrorAvatar
  • 浏览: 48449 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ECMAScript对象属性的类型

阅读更多

ECMAScript对象的属性的类型

理解概念:指的是ECMAScript对象的属性的特征,属性有哪些特征,属性有哪些分类。

一共分两类:数据属性和访问器属性。

数据属性

数据属性特征

  1. [[Configurable]]

    表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。默认true。

  2. [[Enumerable]]

    表示能否通过for-in循环返回属性。默认true。

  3. [[Writable]]

    表示能否修改属性的值。默认true。

  4. [[Value]]

    包含这个属性的数据值。读取属性值的时候,从这个位置读;写入属性值的时候,把新值保存在这个位置。默认true。

修改属性默认特性的方式(理解用,此方法不常用)

ECMAScript5的方法,Object.defineProperty(targetObject, targetProperty, descriptor):

  1. targetObject,属性所在的对象;
  2. targetProperty,属性的名字;
  3. descriptor,描述符(configurable、enumerable、writable和value,注意都是小写)。
//修改writable特性

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

console.log(person.name);  //MirrorAvatar
person.name = "Mudface";  //严格模式(use strict)下,这句会抛出错误
console.log(person.name);  //MirrorAvatar
//修改configurable特性

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

console.log(person.name);  //MirrorAvatar
delete person.name;  //控制台会输出false,严格模式(use strict)下,这句会抛出错误
console.log(person.name);  //MirrorAvatar
 
//configurable特性的不可逆性
var person = {};
Object.defineProperty(person, "name", {
    configurable: false,
    value: "MirrorAvatar"
});

//抛出错误,控制台输出:TypeError: Cannot redefine property: name
Object.defineProperty(person, "name", {
    configurable: true,
    value: "MirrorAvatar"
});
 

Object.defineProperty()方法若是不指定configurable、enumerable和writable的时候,都默认是false。

IE8对Object.defineProperty支持不好,请不要在此浏览器上用此方法。

访问器属性

访问器属性特征

  1. [[Configurable]]

    表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性。默认true。

  2. [[Enumerable]]

    表示能否通过for-in循环返回属性。对于直接在对象上定义的属性。默认值为true。

  3. [[Get]]

    在读取属性时调用的函数。默认值为undefined。

  4. [[Set]]

    在写入属性时调用的函数。默认值为undefined。

访问器属性定义

访问器属性不能直接定义,必须使用ECMAScript5的Object.defineProperty()来定义。

var blog = {
    _year: 2015,
    edition: 1
};

Object.defineProperty(blog, "year", {
    get: function() {
        return this._year;
    },
    set: function(newValue) {

        if(newValue > 2015) {
            this._year = newValue;
            this.edition += newValue - 2015;
        }
    }
});

blog.year = 2016;  
console.log(blog.edition);  //2
 

_year前面的下划线是一种常用的记号,用于表示只能通过对象方法访问的属性。

year这个属性就是所谓的访问器属性。

由控制台输出结果可以发现:设置一个属性值会使其他属性值改变,这是访问器属性的常见使用方式。

访问器属性注意

不需要同时指定getter和setter方法。

  1. 只指定getter方法。

    只能读不能写,如果写会被忽略。严格模式(use strict)下,尝试写会抛出错误。

  2. 只指定setter方法。

    只能写不能读,如果读返回undefined。严格模式(use strict)下,尝试读会抛出错误。

访问器属性非标准方法

defineGetter()和defineSetter()。两个下划线。

var blog = {
    _year: 2015,
    edition: 1
};

//定义访问器的旧方法
blog.__defineGetter__("year", function() {
    return this._year;
});
blog.__defineSetter__("year", function(newValue) {
    if(newValue > 2015) {
        this._year = newValue;
        this.edition += newValue - 2015;
    }
});

blog.year = 2016;
console.log(blog.edition);  //2
 

定义多个属性

ECMAScript5定义的Object.defineProperties()方法。

var blog = {};

Object.defineProperties(blog, {
    _year: {
        value: 2015
    },

    edition: {
        value: 1
    },

    year: {
        get: function() {
            return this._year;
        },

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

blog.year = 2016;
console.log(blog.edition);  // 输出1。为什么是1?不是2?因为还有个属性writable未设置,默认false,不可写。
 

附录:Object.defineProperties()

1
0
分享到:
评论

相关推荐

    EcmaScript面向对象1

    2. **Object类型**:Object类型是唯一一种描述ECMAScript对象的数据类型。对象是一个无序的键值对集合,键通常是字符串,而值可以是任何类型,包括其他对象和函数(方法)。例如: ```javascript var x = { a: 10...

    《JavaScript高级程序设计》阅读笔记(三) ECMAScript中的引用类型

    在《JavaScript高级程序设计》中,对ECMAScript中引用类型的相关知识点进行了详细阐述。引用类型在JavaScript中是非常重要的概念,它们相较于原始类型而言,在内存中占有较大的比重,并且其行为也更为复杂。以下是对...

    ECMAScript

    ECMAScript是现代Web开发的基础之一,掌握了其核心概念如对象类型、基本包装类型、Global对象以及Math对象,能够帮助开发者更好地理解和运用JavaScript语言。在实际开发过程中,合理利用这些特性可以极大地提高代码...

    Qt-Quick核心编程之ECMAScript初探,适合Qt初学者

    ECMAScript是一种弱类型的语言,变量没有固定的数据类型。例如: ```javascript var background = "white"; // 字符串 var i = 0; // 数值 var children = []; // 数组 var focus = true; // 布尔值 ``` ##### 1.3 ...

    JavaScript权威指南-ECMAScript5.pdf

    12. **ECMAScript5**:ECMAScript是JavaScript的标准,第五版引入了严格模式、对象字面量的改进、JSON支持、函数绑定、数组和对象的新方法等特性。 13. **函数式编程**:虽然JavaScript并非纯函数式语言,但其支持...

    ECMAScript-Edition5-小试

    - **属性描述符**:这是 ES5 中新增的重要概念之一,它允许开发者更细致地控制对象属性的行为。属性描述符分为两种类型:数据描述符和访问器描述符。数据描述符包括 `[[Value]]`、`[[Writable]]`、`[[Enumerable]]` ...

    ECMAScript 2020 语言规范(ECMA-262)

    9. **For-in 和 For-of 循环的改进**:现在for-of循环可以直接遍历Map和Set对象,而for-in循环对对象属性的顺序有了明确的规定。 这些新特性的引入,进一步提升了ECMAScript的表达能力和灵活性,同时也反映了编程...

    ECMAScript 2018快速入门 高清完整PDF

    本书分为13章,较为系统地介绍ECMAScript语言,内容包括变量与常量、表达式和运算符、字符串、数字和符号、数组和类型化数组、对象、函数、集合和映射、迭代器和生成器、Promise对象与异步函数、代理、类和模块,...

    ECMAScript5.1规范中文版

    - **特性(Attribute)**:描述对象属性的特性。 - **自身属性(Own Property)**:直接属于一个对象的属性。 - **继承属性(Inherited Property)**:对象通过其原型链继承的属性。 #### 三、记法与约定 ...

    ECMAScript5.1中文版说明

    - 对象的可枚举属性和不可枚举属性:`enumerable`属性控制属性是否能被`for...in`循环遍历。 - `Object.keys()`返回一个数组,包含对象的所有可枚举属性的名称。 - `Function.prototype.bind()`方法,创建一个新...

    深度解析 ECMAScript 6

    对象字面量允许直接在大括号内部定义方法和计算属性名,同时支持属性简写和默认值。这种新语法使得创建和操作对象变得更加便捷。 7. **Promise 对象:** Promise 是处理异步操作的一种方式,它代表一个异步操作的...

    ECMAScript 5中的属性描述符详解

    首先,`Object.defineProperty`是ECMAScript 5中用于定义或修改对象属性的方法。它的基本语法如下: ```javascript Object.defineProperty(obj, prop, descriptor) ``` - `obj`:要操作的对象。 - `prop`:要定义...

    面向对象的程序设计(01)

    面向对象的程序设计:ECMA-262 对对象的定义为:无序的属性集合,其属性包含 ECMAScript 中的基本类型、对象及函数。 简单来讲,对象就是一组没有顺序的值。 对象的每个属性或者方法都有一个标识名,而每个标识名都...

    ECMAScript5中的对象存取器属性:getter和setter介绍

    ECMAScript 5引入了一种新的特性,即对象存取器属性(Accessor Properties),通过getter和setter方法,我们可以更精细地控制对象属性的读取和设置。这些特性为JavaScript对象的属性提供了更多的灵活性和控制力,...

    浅析JavaScript中的对象类型Object_.docx

    JavaScript中的对象类型Object是语言的核心组成部分,它不仅构成了所有复杂数据结构的基础,还扮演着全局对象的角色,提供了许多内置的方法和属性。在这个浅析中,我们将深入探讨Object类型及其相关特性。 首先,...

    深入浅出ES6

    ECMAScript 对象 (objects) 是 属性 (properties) 的集合,每个属性有零个或多个 特性 (attributes),它确定怎样使用此属性。例 如,当设置一个属性的 Writable 特性为 false 时,任何试图更改此属性值的 ...

    besen-master_delphi_inchknf_ECMAScript_

    另外,`Object.defineProperty()`可以精确控制对象属性的访问和修改,包括数据属性和访问器属性。 再者,ES5提供了数组的新方法,如`forEach()`, `map()`, `filter()`, `reduce()`等,这些方法极大地提高了处理数组...

    Go-采用Go编写的ECMAScript5.1()实现

    ECMAScript 5.1是JavaScript的一个重要版本,它引入了许多特性,包括对象的属性访问控制(如getter和setter)、函数的严格模式、JSON支持、以及数组和对象的新方法等。此项目的目标是使Go开发者能够利用这些特性,...

    ECMAScript规范-第三版_中文版

    ECMAScript定义了多种数据类型,包括原始值(如未定义值`undefined`、空值`null`、布尔值、字符串、数字)和对象类型。其中,对象是语言的核心,可以通过构造函数创建,并具有原型链,允许继承和属性扩展。此外,...

Global site tag (gtag.js) - Google Analytics