对象是引用类型(传址类型)
声明定义
new Object()
var obj = new Object();obj.name = "zhangsan";
字面量 👍
var obj = { name: "zhangsan"};
工厂函数
* 返回对象的函数称为工厂函数
function human(name) { return { name, run: function() { console.log("run"); } };}var male = human("zhangsan");male.run(); // "run"
构造函数
*构造函数**类似工厂函数,用于创建对象
* 构造函数每个单词首字母最好大写
*构造函数 this 指向对象实例
* 构造函数不能是箭头函数
* **构造函数默认返回 this,且修改无效
*构造函数函数需要使用 new 关键字创建对象实例**
function Human(name) { this.name = name; this.run = function() { console.log("run"); }}var human = new Human("zhangsan");human.run(); // "run"
Class
* 详见 类章节
Object.create()
* 详见 原型与继承章节
Object.defineProperties()
* 详见 本章节- 属性特征 - Object.defineProperties(obj, description)
属性管理
obj.property
* 点语法
* property 必须是无任何符号连接的单个单词
**_desc_** 添加、读取、修改属性值
**params** { object } obj
**params** { object } property 属性名称
**return** { any } 属性值
var obj = { name: "zhangsan"};obj.age = 18; // 添加var name = obj.name; // 读取obj.name = "lisi"; // 修改
obj[property]
* 中括号语法
* property 可以进行计算属性操作
**_desc_** 添加、读取、修改属性值
**params** { object } obj
**params** { object } property 属性名称
**return** { any } 属性值
var obj = { ["my-name"]: "zhangsan"};obj["my-name"] = 18; // 添加var name = obj["my-name"]; // 读取obj["my-name"] = "lisi"; // 修改
delete obj.property/obj[property]**
* 当属性特征 configurable 为 false 时,无法删除
**_desc_** 删除属性
**params** { object } obj
**params** { object } property 属性名称
**return** { boolean }
var obj = { name: "zhangsan"};var bool = delete obj.name;console.log(obj); // {}console.log(bool); // true
Object.assign(...obj)
* 参数至少两个
* 传入对象存在相同的属性时,后传入的对象会覆盖前面对象该属性的值
* 传入对象存在其他不同的属性时,会在返回对象中添加该属性
* 返回值是第一个传入的参数
**_desc_** 合并对象
**params** { object } 多个对象
**return**_ { object } 返回第一个传入的参数
"use strict";var obj1 = { name: "zhangsan" };var obj2 = { name: "lisi" };var obj3 = { age: 18 };var _obj = Object.assign(obj1, obj2, obj3);console.log(_obj); // { name: "lisi", age: 18 }console.log(_obj === obj1); // true
计算属性
* 对象的属性名称需要计算或存在连接符号
var obj = { [`name-${ 1 + 1}`]: "zhangsan", ["age-18"]: 18};console.log(obj); // { "name-2": "zhangsan, "age-18": 18 }
this
* 对象中的 this 始终指向对象自己
属性访问器
* Javascript 提供的存取器特性,即使用函数来管理属性
* 常用于保护内部私有属性,防止外部直接访问,或读取设置时进行统一处理
* 访问器优先级更高,普通属性和访问器同时存在时,普通属性无效
getter**
**_desc_** 获取属性值
**return** { any } 返回属性值
"use strict";var obj = { name: "zhangsan", _name: "lisi", get name() { return this._name; }};console.log(obj.name); // "lisi"
**
setter**
**_desc_** 设置属性值
**params** { any } value
**return** { void }
var obj = { _name: "zhangsan", get name() { return this._name; }, set name(value) { this._name = value; }};obj.name = "lisi";console.log(obj.name); // "lisi"
枚举遍历
Object.keys(obj)
* 只能获取字符串类型的属性名称,无法获取 Symbol 类型的属性名称
**_desc_** 获取对象中可枚举的属性名称
**params** { object } obj
**return** { array } 可枚举的属性名称组成的数组
"use strict";var obj = { name: "zhangsan", age: 18};var keys = Object.keys(obj);console.log(keys); // ["name", "age"]
Object.values(obj)**
**_desc_** 获取对象中可枚举的属性值
**params** { object } obj
**return** { array } 可枚举的属性值组成的数组
var obj = { name: "zhangsan", age: 18};var values = Object.values(obj);console.log(values); // ["zhangsan", 18]
Object.entries(obj)
只能获取字符串类型的属性名称,无法获取 Symbol 类型的属性名称*
**_desc_** 获取对象中可枚举的属性名称和属性值
**params** { object } obj
**return** { array } 可枚举的属性名称数组和属性值数组组成的二维数组
var obj = { name: "zhangsan", age: 18};var entries = Object.entries(obj);console.log(entries); // [ ["name", "age"], ["zhangsan", 18] ]
Object.fromEntries(arr)**
**_desc_** 将属性名数组和属性值数组组成的二维数组转换为对象
**params** { array } arr
**return** { object }
var arr = [["name", "age"], ["zhangsan", 18]];var obj = Object.fromEntries(arr);console.log(obj); // { name: "zhangsan", age: 18 }
Object.getOwnPropertyNames(obj)**
* 既可以获取可枚举的属性名称,也可以获取不可枚举的属性名称
* 只能获取字符串类型的属性名称,无法获取 Symbol 类型的属性名称
**_desc_** 获取对象中所有的属性名称
**params** { object } obj
**return** { array } 所有属性名称数组和属性值数组组成的二维数组
"use strict";var obj = Object.defineProperties({}, { name: { value: "zhangsan", enumerable: true }, age: { value: 18, enumerable: false }});var keys1 = Object.keys(obj);console.log(keys1); // ["name"]var keys2 = Object.getOwnPropertyNames(obj);console.log(keys2); // ["name", "age"]
Object.getOwnPropertySymbols(obj)
* 只能获取 Symbol 类型的属性名称,无法获取其他类型的属性名称
**_desc_** 获取对象中所有 Symbol 类型的属性名称
**params** { object } obj
**return** { array } 所有 Symbol 类型的属性名称组成的数组
var obj = { [Symbol("name")]: "zhangsan", age: 18}console.log(obj); // { Symbol(name): "zhangsan", age: 18 }var symbols = Object.getOwnPropertySymbols(obj);console.log(symbols); // [ Symbol(name) ]
Reflect.ownKeys(obj)
*可以获取**任意类型的属性名称
* 既可以获取可枚举的属性名称,也可以获取不可枚举的属性名称
**_desc_** 获取对象中所有属性名称
**params** { object } obj
**return** { array } 所有属性名称组成的数组
var obj = { [Symbol("name")]: "zhangsan", age: 18, [Symbol("sex")]: "male"};console.log(Reflect.ownKeys(obj)); // ["age", Symbol(name), Symbol(sex)]
for in**
**_desc_** 遍历属性名称
**params** { object } obj
**params** { string } key 属性名称
**return** { void }
"use strict";var obj = { name: "zhangsan", age: 18};for (let key in obj) { console.log(key); // "name" ---> "age"}
for of
* 循环遍历的对象必须是可迭代的,一般通过 Object.keys | Object.values | Object.entries 将对象转换为数组再遍历
**_desc_** 遍历属性值
**params** { array } obj
**params** { any } value 属性值
**return** { void }
"use strict";var obj = { name: "zhangsan", age: 18};for (let value of Object.values(obj)) { console.log(value); // "zhangsan" ---> 18}
属性特征
四大属性特征**
| 特征 |
说明 |
默认值 |
| value |
对象属性的值 |
undefined |
| writable |
对象属性是否可修改 |
true |
| enumerable |
对象属性是否可枚举(是否可通过循环、Object.keys()等读取对象属性) |
true |
| configurable |
能否使用 delete、能否修改属性特征、能否修改访问器属性 |
true |
* 设置属性特征 writable 为 false,即禁止修改时,普通模式修改对象属性不会报错,但修改不生效,严格模式会报错:Cannot assign to read only property ‘xxx’ of object ‘<#Object>’
设置*属性特征** configurable 为 false,即禁止配置时,普通模式删除对象属性不会报错,但删除不生效,严格模式会报错:Cannot delete property ‘sex’ of #