当前位置:首页 > 技术 > 正文内容

JavaScript 核心机制:构造函数、原型链与 Class 语法解析

访客 技术 2026年8月23日 2

构造函数与原型对象的关系

在 JavaScript 中,每当声明一个函数时,引擎会在内存中自动为其创建一个关联的对象,这个对象被称为原型对象。函数(此时作为构造函数)内部会包含一个 prototype 属性,该属性直接指向这个原型对象。反之,原型对象内部也存在一个 constructor 属性,它指回构造函数本身。

function Vehicle(brand, year) {
    this.brand = brand;
    this.year = year;
}

// 验证 constructor 的指向
console.log(Vehicle.prototype.constructor === Vehicle); // true

// 实例化对象
const myCar = new Vehicle("Toyota", 2023);

构造函数与原型对象关系图

实例化与原型链查找机制

使用 new 关键字调用构造函数会生成一个实例对象。需要注意的是,实例对象本身并没有 prototype 属性,但它拥有一个隐藏属性 __proto__。这个 __proto__ 属性直接指向构造函数的原型对象。

function Device(type) {
    this.type = type;
}

const laptop = new Device("PC");

// 实例的 __proto__ 指向构造函数的 prototype
console.log(laptop.__proto__ === Device.prototype); // true

实例、原型与构造函数关系图

当我们在原型对象上添加属性或方法时,所有由该构造函数创建的实例都可以共享这些成员。实例在访问某个属性时,如果在自身找不到,就会顺着 __proto__ 向上查找原型对象,这就是原型链的核心机制。

Device.prototype.status = "active";

console.log(laptop.status); // "active" (从原型对象获取)

// 属性遮蔽 (Shadowing)
laptop.status = "offline"; 
console.log(laptop.status); // "offline" (访问实例自身的属性)
console.log(Device.prototype.status); // "active" (原型属性未被修改)

原型链查找机制图

通过实例直接赋值(如 laptop.status = "offline"),并不会修改原型上的值,而是在实例自身创建了一个同名属性。这个新属性会"遮蔽"原型链上的同名属性,导致后续访问时只返回实例上的值。

Class 语法糖的本质

ES6 引入的 class 关键字本质上是基于原型链的语法糖,它让面向对象编程的写法更加清晰和接近传统语言。类中的方法会被自动挂载到构造函数的 prototype 上。

class Product {
    constructor(name, price) {
        this.name = name;
        this.price = price;
    }

    // 实例方法,等同于 Product.prototype.getDetails = function() {...}
    getDetails() {
        return `${this.name} costs $${this.price}`;
    }
}

const item = new Product("Laptop", 999);
console.log(item.getDetails()); 

实例成员与静态成员

在面向对象设计中,成员分为实例级别和类级别(静态):

  • 实例属性/方法:必须通过 new 创建实例后才能访问,通常定义在构造函数内部或原型上。
  • 静态属性/方法:直接挂载在构造函数(或类)本身上,实例无法访问,只能通过类名调用。在 class 中使用 static 关键字声明。
class Database {
    // 静态属性
    static defaultPort = 3306;

    constructor(host) {
        // 实例属性
        this.host = host; 
    }

    // 实例方法
    query(sql) {
        console.log(`Executing: ${sql} on ${this.host}`);
    }

    // 静态方法
    static establishConnection() {
        console.log(`Connecting via default port ${this.defaultPort}...`);
    }
}

const db = new Database("localhost");

// 访问实例成员
console.log(db.host); // "localhost"
db.query("SELECT * FROM users");

// 访问静态成员
console.log(Database.defaultPort); // 3306
Database.establishConnection();

// 实例无法访问静态成员
console.log(db.defaultPort); // undefined

静态属性与实例属性区别图

Class 的继承机制

使用 extends 关键字可以实现类的继承。在子类的 constructor 中,必须调用 super() 来执行父类的构造逻辑,从而正确初始化继承来的实例属性。

class Shape {
    constructor(color) {
        this.color = color;
    }
}

class Rectangle extends Shape {
    constructor(color, width, height) {
        super(color); // 调用父类构造函数初始化 color
        this.width = width;
        this.height = height;
    }

    calculateArea() {
        return this.width * this.height;
    }
}

const myRect = new Rectangle("blue", 10, 20);
console.log(myRect.color); // "blue" (继承自父类)
console.log(myRect.calculateArea()); // 200

Class 继承关系图

标签: JavaScript

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。