likes
comments
collection
share

深入探索JavaScript的原型与原型链

作者站长头像
站长
· 阅读数 21

在JavaScript的世界里,原型和原型链是理解对象继承和属性查找的关键概念。本文旨在通过逐步深入的分析,帮助你彻底掌握这些核心概念,同时对原型和原型链的运作机制有一个全面的理解。

一、构造函数:对象的创造者

构造函数是用于创建特定类型对象的函数,通过new关键字调用。构造函数与普通函数的主要区别在于调用方式,尽管它们在语法上几乎相同。

// 定义构造函数Person
function Person(name, age) {
    // 使用this关键字绑定实例属性
    this.name = name;
    this.age = age;
}

// 创建Person的实例
let per1 = new Person('小张', 10);

二、原型对象:属性的共享空间

在JavaScript中,每个函数都有一个prototype属性,该属性指向一个对象,即原型对象。原型对象主要用于存储所有实例对象共享的属性和方法。

// 在Person的原型上添加species属性和say方法
Person.prototype.species = '人类';
Person.prototype.say = function () {
    console.log("Hello, 我是" + this.name);
};

// 使用原型上的方法
per1.say(); // 输出: Hello, 我是小张

深入探索JavaScript的原型与原型链

三、原型链:属性查找的路线图

在JavaScript中,当尝试访问一个对象的属性或方法时,如果该对象本身不包含该属性或方法,JavaScript引擎会沿着原型链向上查找,直至找到该属性或方法或达到原型链的终点。

显示原型 vs. 隐式原型

  • 显示原型:通过prototype属性访问原型对象,仅适用于函数类型数据。
  • 隐式原型:通过__proto__属性访问原型对象,适用于所有对象类型数据,包括由构造函数创建的对象实例。
// 检查实例的隐式原型
console.log(per1.__proto__ === Person.prototype); // true

原型链的结构

原型链的起点是对象实例的__proto__属性,然后依次向上到构造函数的prototype属性,直到Object.prototype,最后指向null

// 查找属性时,会遍历整个原型链
console.log(per1.toString()); // 调用Object.prototype上的toString方法

深入探索JavaScript的原型与原型链

四、函数:特殊的对象

在JavaScript中,函数不仅能够执行,还被视为对象。这意味着函数可以拥有属性和方法,甚至可以作为对象的属性赋值给变量。

// 函数作为对象的属性
let funcObj = {
    sayHi: function () {
        console.log("Hi!");
    }
};

funcObj.sayHi(); // Hi!

函数的原型链

函数的构造函数是Function,因此函数的原型链包括:

  1. 函数实例
  2. Function.prototype
  3. Object.prototype
  4. null
// 函数的构造函数和原型链
console.log(Person.constructor === Function); // true
console.log(Person.__proto__ === Function.prototype); // true

深入探索JavaScript的原型与原型链

五、总结

  • 构造函数:使用new关键字创建对象的函数,所有函数都是Function的实例。
  • 原型对象:用于存储实例共享的属性和方法,提高内存使用效率。
  • 原型链:属性查找机制,从对象自身开始,沿着__proto__属性向上查找,直至Object.prototype
  • 函数:既是可执行的代码块,也是具有属性和方法的对象。

通过深入了解原型和原型链,我们不仅能够更有效地管理对象属性和方法的共享,还能更清晰地理解JavaScript中的对象继承和属性查找机制,这对于编写高效、可维护的代码至关重要。

转载自:https://juejin.cn/post/7388338139633303603
评论
请登录