对象是引用类型(传址类型)
声明定义
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 #