前端

重学对象

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. 原型和原型链

  1. 几乎所有的对象都有原型,但不是所有。Object.prototype 是原型链的顶端,它没有原型。
  2. 所有的对象都有一个__proto__属性,__proto__指向它的原型。
  3. 函数对象比较特殊,它有prototype__proto__两个属性,__proto__指向它的原型;而作为构造函数时,prototype指向用于构造实例对象的原型。
  4. 可以通过__proto__找到对象的原型,一直到 Object.prototype,这就是原型链,原型链是实现继承的主要方式。
  5. __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()

Previous
JavaScript类型 - 一些细节记录