前端
重学对象
1. 对象的基本概念
对象在JavaScript中是键值对的集合。每个对象都是独一无二的实例。 也可以理解为对象是属性的无序集合。
JS中的对象是动态的,可以动态的添加、删除属性,是按引用操作而不是按值操作。
2. 对象的创建方式
2.1 对象字面量
最简单直接的创建对象的方式。
let car = {
brand: 'Tesla',
model: 'Model 3',
start: function() {
console.log('启动' + this.brand + ' ' + this.model);
}
};
2.2 构造函数 (new)
new操作符用于创建和初始化一个新对象,new关键字必须跟一个函数调用。
function Person(brand, model) {
this.brand = brand;
this.model = model;
this.start = function() {
console.log('启动' + this.brand + ' ' + this.model);
};
}
let person1 = new Person('Tesla', 'Model 3');
person1.start();
2.3 Object.create()
基于现有对象创建新对象。
let car = {
brand: 'Tesla',
model: 'Model 3',
start: function() {
console.log('启动' + this.brand + ' ' + this.model);
}
};
let car1 = Object.create(car);
car1.start(); // 输出:启动Tesla Model 3
3. 原型和原型链
- 几乎所有的对象都有原型,但不是所有。
Object.prototype
是原型链的顶端,它没有原型。 - 所有的对象都有一个
__proto__
属性,__proto__
指向它的原型。 - 函数对象比较特殊,它有
prototype
和__proto__
两个属性,__proto__
指向它的原型;而作为构造函数时,prototype
指向用于构造实例对象的原型。 - 可以通过
__proto__
找到对象的原型,一直到Object.prototype
,这就是原型链,原型链是实现继承的主要方式。 __proto__
是非标准属性,推荐使用Object.getPrototypeOf()
来获取对象的原型。
4. 对象的属性
属性有一个名字和一个值。属性的名字是字符串,值可以是任意类型。 除了名字和值外,每个属性还有3个属性特征(property attribute):
- 可写(writable): 表示是否可以修改属性的值。
- 可枚举(enumerable): 表示是否可以通过for-in循环返回属性。
- 可配置(configurable): 表示是否可以删除属性。
let person = {
name: '张三',
age: 20
};
Object.defineProperty(person, 'name', {
writable: false, // 不可写
enumerable: false, // 不可枚举
configurable: false // 不可配置
});
5. 常用的方法
Object.keys()
Object.values()
Object.assign()
Object.create()
Object.defineProperty()
Object.getOwnPropertyDescriptor()
Object.getOwnPropertyNames()
Object.getPrototypeOf()
Object.prototype.toString()
Object.prototype.valueOf()
Object.prototype.hasOwnProperty()
Object.prototype.isPrototypeOf()