JavaScript 对象属性
source link: https://www.myfreax.com/javascript-object-properties/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
JavaScript 对象属性
在本教程中,您将了解 JavaScript 对象的数据属性和访问器属性,例如可配置、可枚举、可写、获取、设置和值。
对象属性类型
JavaScript 通过两对方括号括起来的内部属性来指定对象的属性特征,例如[[Enumerable]]
等。对象有两种类型的属性:数据和访问器属性。
数据属性包含数据值的单个位置。数据属性有四个属性:
[[Configurarable]]
– 确定是否可以通过delete
运算符重新定义或删除属性。[[Enumerable]]
– 指示是否可以在for...in
循环中返回属性。[[Writable]]
– 指示是否可以修改属性的值。[[Value]]
– 包含属性的实际值。
默认情况下,对于直接在对象定义的所有属性将 [[Configurable]]
,[[Enumerable]]
, 和[[Writable]]
属性设置为 true
。[[Value]]
属性的默认值为undefined
。
以下示例创建一个 person
对象,person
对象有两个属性 firstName
和lastName
并将可配置、可枚举和可写属性设置为 true
。person
对象的属性值分别设置为 'John'
和 'Doe'
:
let person = {
firstName: 'John',
lastName: 'Doe'
};
要修改对象属性的属性描述符,您可以使用 Object.defineProperty()
方法。Object.defineProperty()
方法接受三个参数:
- 一个对象。
- 对象的属性名称。
- 一个对象具有四个属性的属性描述符:
configurable
、enumerable
、writable
和value
。
在使用 Object.defineProperty()
方法定义对象的属性时,如果未指定四个属性描述符的值,Object.defineProperty()
方法将 [[Configurable]]
,[[Enumerable]]
、 和 [[Writable]]
的默认值设置为 false
。
以下示例创建一个具有 age
属性的 person
对象:
let person = {};
person.age = 25;
由于 [[Configurable]]
属性的默认值设置为 true
,您可以通过 delete
运算符将属性删除:
delete person.age;
console.log(person.age);
undefined
以下示例创建一个 person
对象并使用 Object.defineProperty()
方法向其添加 ssn
属性:
'use strict';
let person = {};
Object.defineProperty(person, 'ssn', {
configurable: false,
value: '012-38-9119'
});
delete person.ssn;
TypeError: Cannot delete property 'ssn' of #<Object>
在此示例中,configurable
属性设置为 false
。因此,删除 person
对象的 ssn
属性会导致错误, TypeError: Cannot delete property-类型错误不能删除属性。
此外,一旦将属性定义为不可配置,就无法再修改为可配置。如果您使用Object.defineProperty()
方法修改除可写属性之外的任何属性。
您将收到错误消息 TypeError: Cannot redefine property 。例如以下示例:
'use strict';
let person = {};
Object.defineProperty(person, 'ssn', {
configurable: false,
value: '012-38-9119'
});
Object.defineProperty(person, 'ssn', {
configurable: true
});
TypeError: Cannot redefine property: ssn
默认情况下,一个对象定义的所有属性的 enumerable
属性都是 true
。这意味着您可以使用 for...in
循环遍历所有对象属性:
let person = {};
person.age = 25;
person.ssn = '012-38-9119';
for (let property in person) {
console.log(property);
}
age
ssn
以下示例将 ssn
属性的 enumerable
数据属性设置为 false
,你将不可枚举 ssn 属性。
let person = {};
person.age = 25;
person.ssn = '012-38-9119';
Object.defineProperty(person, 'ssn', {
enumerable: false
});
for (let prop in person) {
console.log(prop);
}
age
访问器属性
与数据属性类似,访问器属性也有 [[Configurable]]
和 [[Enumerable]]
属性。但是访问器属性有 [[Get]]
和[[Set]]
属性而不是 [[Value]]
和 [[Writable]]
。
当您从访问器属性读取数据时,[[Get]]
函数会自动调用并返回一个值。[[Get]]
函数的默认返回值是 undefined
。
如果您为访问器属性赋值,[[Set]]
函数将被自动调用。要定义访问器属性,您必须使用 Object.defineProperty()
方法。例如以下示例:
let person = {
firstName: 'John',
lastName: 'Doe'
}
Object.defineProperty(person, 'fullName', {
get: function () {
return this.firstName + ' ' + this.lastName;
},
set: function (value) {
let parts = value.split(' ');
if (parts.length == 2) {
this.firstName = parts[0];
this.lastName = parts[1];
} else {
throw 'Invalid name format';
}
}
});
console.log(person.fullName);
'John Doe'
在这个示例:
- 首先,定义包含两个属性的
person
对象:firstName
和lastName
。 - 然后,将
fullName
属性作为访问器属性添加到person
对象。
在 fullname
访问器属性中:
[[Get]]
返回fullname
, ,它是firstName
,space
和lastName
连接的结果。[[Set]]
方法按空格拆分参数,并将名称的相应部分分配给firstName
和lastName
属性。- 如果
fullname
的格式不正确,即名字、空格和姓氏,它将抛出错误。
Object.defineProperties() 定义多个属性
在 ES5 中,您可以使用 Object.defineProperties()
方法在单个语句中定义多个属性。例如示例:
var product = {};
Object.defineProperties(product, {
name: {
value: 'Smartphone'
},
price: {
value: 799
},
tax: {
value: 0.1
},
netPrice: {
get: function () {
return this.price * (1 + this.tax);
}
}
});
console.log('The net price of a ' + product.name + ' is ' + product.netPrice.toFixed(2) + ' USD');
The net price of a Smartphone is 878.90 USD
在此示例中,我们定义了三个数据属性:name
、price
和 tax
,以及 product
对象 netPrice
的一个访问器属性。
JavaScript 对象属性描述符
Object.getOwnPropertyDescriptor()
方法允许您获取属性的描述符对象。Object.getOwnPropertyDescriptor()
方法有两个参数:
- 对象的一个属性
它返回描述属性的描述符对象。描述符对象有四个属性:可配置、可枚举、可写和值。下面的示例获取前面示例 product
对象的 name
属性的描述符对象。
let person = {
firstName: 'John',
lastName: 'Doe'
};
let descriptor = Object.getOwnPropertyDescriptor(person, 'firstName');
console.log(descriptor);
{ value: 'John',
writable: true,
enumerable: true,
configurable: true }
- JavaScript 对象有两种类型的属性:数据属性和访问器属性。
- JavaScript 使用
[[...]]
表示的内部属性来描述属性的特征,例如[[Configurable]]
、[[Enumerable]]
、[[Writable]]
、 和[[Value]]
、[[Get]]
、 和[[Set]]
。 Object.getOwnPropertyDescriptor()
方法返回对象属性的属性描述符。- 属性可以直接在对象定义,也可以通过
Object.defineProperty()
或Object.defineProperties()
方法间接定义。这些方法可用于修改属性的特征。
微信公众号
支付宝打赏
Recommend
-
10
问题重现 需求是要获取一个车型列表,并且输出到页面上按年份排序,故而接口提供的对象简化如下 let obj = { '2018': { modelCode: "204313", modelName: "2018款 Vanquish 6.0L S Coupe"...
-
25
本文介绍下Java对象属性复制组件(MapStruct),以及项目中引入遇到的坑。 1. 问题背景 日常编程中,经常会碰到对象属性复制的场景,就比如下面这样一个常见的三层MVC架构。
-
10
细说JavaScript中对象的属性和方法 原创 ...
-
7
申明:资料来源于网络及书本,通过理解、实践、整理成学习笔记。 类(Class) 类的定义与使用 类必须在被定义后才能使用,定义一个类也就是定义这一类对象的模板,定义它的属性和方法。python中提供了class关键字来声明一个类,cla...
-
4
《Spring 手撸专栏》第 5 章:一鸣惊人,为Bean对象注入属性和依赖Bean的功能实现持续坚持原创输出,点击蓝字关注我吧 作者:小傅哥博客:https://bugstack.cn ❝ 沉淀、分享、成长,让自己和他...
-
1
1、writable:可写 writable表示是否可以设置属性的值 let obj = {age:10} obj.age = 1 // 给...
-
7
面试官:JavaScript对象属性是有序的吗?更新日期: 2022-07-15阅读: 16标签:
-
6
...
-
4
JavaScript 对象自身属性 在本教程中,您将了解 JavaScript 对象的自身属性 Own Properties
-
4
五种在 JavaScript 中访问对象属性的方法 作者:佚名 2023-06-02 15:42:51 在 JavaScript 中,对象是语言的基本组成部分,广泛用于表示数据结构。对象由保存值的属性组成。为了访问这些属性,JavaScript 提供了多...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK