ECMAScript对象的属性的类型
理解概念:指的是ECMAScript对象的属性的特征,属性有哪些特征,属性有哪些分类。
一共分两类:数据属性和访问器属性。
数据属性
数据属性特征
-
[[Configurable]]
表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。默认true。
-
[[Enumerable]]
表示能否通过for-in循环返回属性。默认true。
-
[[Writable]]
表示能否修改属性的值。默认true。
-
[[Value]]
包含这个属性的数据值。读取属性值的时候,从这个位置读;写入属性值的时候,把新值保存在这个位置。默认true。
修改属性默认特性的方式(理解用,此方法不常用)
ECMAScript5的方法,Object.defineProperty(targetObject, targetProperty, descriptor):
- targetObject,属性所在的对象;
- targetProperty,属性的名字;
- 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支持不好,请不要在此浏览器上用此方法。
访问器属性
访问器属性特征
-
[[Configurable]]
表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性。默认true。
-
[[Enumerable]]
表示能否通过for-in循环返回属性。对于直接在对象上定义的属性。默认值为true。
-
[[Get]]
在读取属性时调用的函数。默认值为undefined。
-
[[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方法。
-
只指定getter方法。
只能读不能写,如果写会被忽略。严格模式(use strict)下,尝试写会抛出错误。
-
只指定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,不可写。
相关推荐
2. **Object类型**:Object类型是唯一一种描述ECMAScript对象的数据类型。对象是一个无序的键值对集合,键通常是字符串,而值可以是任何类型,包括其他对象和函数(方法)。例如: ```javascript var x = { a: 10...
在《JavaScript高级程序设计》中,对ECMAScript中引用类型的相关知识点进行了详细阐述。引用类型在JavaScript中是非常重要的概念,它们相较于原始类型而言,在内存中占有较大的比重,并且其行为也更为复杂。以下是对...
ECMAScript是现代Web开发的基础之一,掌握了其核心概念如对象类型、基本包装类型、Global对象以及Math对象,能够帮助开发者更好地理解和运用JavaScript语言。在实际开发过程中,合理利用这些特性可以极大地提高代码...
ECMAScript是一种弱类型的语言,变量没有固定的数据类型。例如: ```javascript var background = "white"; // 字符串 var i = 0; // 数值 var children = []; // 数组 var focus = true; // 布尔值 ``` ##### 1.3 ...
12. **ECMAScript5**:ECMAScript是JavaScript的标准,第五版引入了严格模式、对象字面量的改进、JSON支持、函数绑定、数组和对象的新方法等特性。 13. **函数式编程**:虽然JavaScript并非纯函数式语言,但其支持...
- **属性描述符**:这是 ES5 中新增的重要概念之一,它允许开发者更细致地控制对象属性的行为。属性描述符分为两种类型:数据描述符和访问器描述符。数据描述符包括 `[[Value]]`、`[[Writable]]`、`[[Enumerable]]` ...
9. **For-in 和 For-of 循环的改进**:现在for-of循环可以直接遍历Map和Set对象,而for-in循环对对象属性的顺序有了明确的规定。 这些新特性的引入,进一步提升了ECMAScript的表达能力和灵活性,同时也反映了编程...
本书分为13章,较为系统地介绍ECMAScript语言,内容包括变量与常量、表达式和运算符、字符串、数字和符号、数组和类型化数组、对象、函数、集合和映射、迭代器和生成器、Promise对象与异步函数、代理、类和模块,...
- **特性(Attribute)**:描述对象属性的特性。 - **自身属性(Own Property)**:直接属于一个对象的属性。 - **继承属性(Inherited Property)**:对象通过其原型链继承的属性。 #### 三、记法与约定 ...
- 对象的可枚举属性和不可枚举属性:`enumerable`属性控制属性是否能被`for...in`循环遍历。 - `Object.keys()`返回一个数组,包含对象的所有可枚举属性的名称。 - `Function.prototype.bind()`方法,创建一个新...
对象字面量允许直接在大括号内部定义方法和计算属性名,同时支持属性简写和默认值。这种新语法使得创建和操作对象变得更加便捷。 7. **Promise 对象:** Promise 是处理异步操作的一种方式,它代表一个异步操作的...
首先,`Object.defineProperty`是ECMAScript 5中用于定义或修改对象属性的方法。它的基本语法如下: ```javascript Object.defineProperty(obj, prop, descriptor) ``` - `obj`:要操作的对象。 - `prop`:要定义...
面向对象的程序设计:ECMA-262 对对象的定义为:无序的属性集合,其属性包含 ECMAScript 中的基本类型、对象及函数。 简单来讲,对象就是一组没有顺序的值。 对象的每个属性或者方法都有一个标识名,而每个标识名都...
ECMAScript 5引入了一种新的特性,即对象存取器属性(Accessor Properties),通过getter和setter方法,我们可以更精细地控制对象属性的读取和设置。这些特性为JavaScript对象的属性提供了更多的灵活性和控制力,...
JavaScript中的对象类型Object是语言的核心组成部分,它不仅构成了所有复杂数据结构的基础,还扮演着全局对象的角色,提供了许多内置的方法和属性。在这个浅析中,我们将深入探讨Object类型及其相关特性。 首先,...
ECMAScript 对象 (objects) 是 属性 (properties) 的集合,每个属性有零个或多个 特性 (attributes),它确定怎样使用此属性。例 如,当设置一个属性的 Writable 特性为 false 时,任何试图更改此属性值的 ...
另外,`Object.defineProperty()`可以精确控制对象属性的访问和修改,包括数据属性和访问器属性。 再者,ES5提供了数组的新方法,如`forEach()`, `map()`, `filter()`, `reduce()`等,这些方法极大地提高了处理数组...
ECMAScript 5.1是JavaScript的一个重要版本,它引入了许多特性,包括对象的属性访问控制(如getter和setter)、函数的严格模式、JSON支持、以及数组和对象的新方法等。此项目的目标是使Go开发者能够利用这些特性,...
ECMAScript定义了多种数据类型,包括原始值(如未定义值`undefined`、空值`null`、布尔值、字符串、数字)和对象类型。其中,对象是语言的核心,可以通过构造函数创建,并具有原型链,允许继承和属性扩展。此外,...