原型链

原型和原型链

1
2
3
4
所有对象都是通过“new 函数”创建
所有的函数也是对象
函数中可以有属性
所有对象都是引用类型

JavaScript 中的原型链是一种对象之间继承关系的表示方式,它基于原型(prototype)和原型对象(prototype object)的概念。每个 JavaScript 对象都有一个原型对象,它可以包含属性和方法,这些属性和方法可以被对象本身访问和继承。

以下是关于 JavaScript 原型链的一些关键概念:

  1. 构造函数和原型对象

    • 在 JavaScript 中,通常通过构造函数来创建对象。构造函数本身也是一个函数,可以创建多个具有相同属性和方法的对象。
    • 构造函数有一个原型对象,通常称为 prototype。该原型对象包含了对象实例可以继承的属性和方法。
  2. 对象实例和原型对象之间的关系

    • 对象实例是由构造函数创建的,它们可以访问构造函数的原型对象上的属性和方法。
    • 如果对象实例上没有找到某个属性或方法,JavaScript 引擎会继续查找该对象的原型对象,以及原型对象的原型对象,依此类推,直到找到或者达到原型链的顶端为止。
  3. 原型链

    • 原型链是一种对象之间的继承链条,由原型对象构成。当一个对象需要访问属性或方法时,它会首先在自己的属性中查找,如果没有找到,就会继续在原型对象中查找,然后在原型对象的原型对象中查找,以此类推,直到找到或者达到原型链的顶端。
    • 原型链的终点是 Object.prototype,它是 JavaScript 中所有对象的顶层原型对象。
  4. 隐式原型

    • 所有的对象都有一个属性__proto__ ,默认情况下,隐式原型指向创建该对象的函数的原型。称之为隐式原型

以下是一个简单的示例,演示了 JavaScript 原型链的基本用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 定义一个构造函数
function Person(name) {
this.name = name;
}

// 在构造函数的原型对象上添加方法
Person.prototype.sayHello = function () {
console.log(`Hello, my name is ${this.name}`);
};

// 创建对象实例
const person1 = new Person("Alice");
const person2 = new Person("Bob");

// 调用对象实例的方法
person1.sayHello(); // 输出: Hello, my name is Alice
person2.sayHello(); // 输出: Hello, my name is Bob

// 对象实例继承原型对象的方法
console.log(person1.hasOwnProperty("sayHello")); // 输出: false
console.log(person1.__proto__.hasOwnProperty("sayHello")); // 输出: true

在这个示例中,Person 构造函数有一个原型对象 Person.prototype,该原型对象包含 sayHello 方法。通过 person1person2 对象实例,我们可以调用 sayHello 方法,因为它们继承自 Person.prototype。同时,我们可以看到 hasOwnProperty 方法只在对象实例上返回 true,而不会在原型链上返回 true,这说明了原型链的工作原理。

当访问一个对象的成员时:
1.看该对象自身是否拥有该成员,如果有直接使用
2.看该对象的隐式原型是否拥有该成员,如果有直接使用
猴子补丁: 在函数原型中加入成员,以增强起对象的功能,猴子补丁会导致原型污染,使用需谨

20201203153642372.png


原型链
http://jhayes.cn/blog/200855344.html
作者
JHAYES
发布于
2021年12月17日
许可协议