原型和原型链

原型

实例对象共享的属性和方法,可以抽离出来放在一个对象中,这个对象就是原型对象。

  1. 构造函数中,使用 prototype 指向原型对象
  2. 实例对象中,使用 proto 指向原型对象
  3. 原型对象中,使用 construct 指向构造函数
  4. 实例对象中,使用 construct 指向构造函数
1
2
3
4
5
6
7
8
9
10
function Person(name) {
this.name = name;
}
const p1 = new Person('Tom');
console.log('p1: ', p1);

console.log(Person.prototype === Object.getPrototypeOf(p1));
console.log(p1.__proto__ === Object.getPrototypeOf(p1));
console.log(Object.getPrototypeOf(p1).construct === Person());
console.log(p1.construct === Person());

instanceof: 用于检测构造函数的原型对象是否出现在某个实例对象的原型链上

1
console.log(p1 instanceof Person); // true

操作原型的方法:

  • Object.create: 根据指定的原型对象创建新对象。Object.create(proto, [propertiesObject])
  • Object.getPrototypeOf: 获取一个对象的原型。Object.getPrototypeOf(obj)
  • Object.setPrototypeOf: 设置一个对象的原型。Object.setPrototypeOf(obj, prototype)
  • Object.prototype.isPrototypeOf(): 返回一个布尔值,表示指定的对象是否在本对象的原型链中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// 操作原型的方法
const parentObj = {
add: function () {
return this.a + this.b;
},
};

// Object.create: 接收一个现有对象为新对象的__proto__,第二参数为属性描述符对象
const newObj = Object.create(parentObj, {
a: {
value: 10,
},
b: {
value: 20,
},
});
console.log(newObj.add()); // 30

const childObj = {
a: 10,
b: 20,
};
// 设置一个指定对象的原型
Object.setPrototypeOf(childObj, parentObj);
console.log(childObj.add()); // 30

// 获取指定对象的原型
console.log(Object.getPrototypeOf(childObj)); // {add: f}

// 返回一个布尔值,用于检测一个对象的原型是否在另一个对象的原型链上
console.log(parentObj.isPrototypeOf(childObj)); // true

实例、原型对象、构造函数关系图:
pic.1708405528743

原型链

定义:
每一个对象都包含一个原型属性,用于关联另一个对象,关联后就能够使用那个对象的属性和方法;对象之前通过原型关联在一起,就好比一条锁链将一个个对象连接在一起,最终形成了一条原型链。

属性查找机制:
当查找对象属性时,如果实例对象自身不存在该属性,就从原型链往上一级查找,如果还没找到就再往上一级,直至最顶级的原型对象 Object.prototype,如果还没找到则返回 undefined

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×