首页 > 编程语言 >JavaScript 的原型链机制

JavaScript 的原型链机制

时间:2024-06-15 22:01:25浏览次数:35  
标签:构造函数 name 对象 JavaScript 原型 机制 prototype 属性

JavaScript 的原型链机制是其继承模型的核心概念,它允许对象通过原型链访问和继承其他对象的属性和方法。原型链机制是实现 JavaScript 面向对象编程的基础。

1. 原型和原型链的基本概念

  • 原型对象(prototype): 每个 JavaScript 对象(除了 null)都有一个与之关联的对象,这个对象就是原型。当一个对象尝试访问一个属性或方法时,如果这个对象没有该属性或方法,JavaScript 引擎会继续在其原型对象中查找。

  • __proto__ 属性: 这是每个对象都有的隐式属性(非标准,但大多数浏览器支持),指向其构造函数的原型对象。

  • 构造函数的 prototype 属性: 每个构造函数都有一个 prototype 属性,这个属性是一个对象,包含由该构造函数创建的实例共享的属性和方法。

2. 原型链的构建

当一个对象访问一个属性或方法时,JavaScript 引擎会首先在这个对象自身的属性中查找。如果没有找到,它会继续查找该对象的原型对象,依此类推,直到找到该属性或方法,或达到原型链的顶端(即 Object.prototype),如果仍然没有找到,则返回 undefined

示例
function Person(name) {
    this.name = name;
}

Person.prototype.sayHello = function() {
    console.log(`Hello, my name is ${this.name}`);
};

const alice = new Person('Alice');
alice.sayHello(); // 输出: Hello, my name is Alice

在这个示例中,当调用 alice.sayHello() 时,JavaScript 引擎会首先检查 alice 对象是否有 sayHello 方法。如果没有,它会继续查找 alice.__proto__,即 Person.prototype,并找到 sayHello 方法。

3. 原型链的顶端

所有对象的原型链最终都会指向 Object.prototype,这是原型链的顶端。Object.prototype 本身的原型是 null

console.log(Object.prototype.__proto__); // 输出: null

4. 原型链的实际应用

继承

通过原型链,JavaScript 实现了对象的继承。一个对象可以通过原型链继承另一个对象的属性和方法。

function Animal(name) {
    this.name = name;
}

Animal.prototype.move = function() {
    console.log(`${this.name} is moving`);
};

function Dog(name) {
    Animal.call(this, name); // 调用父构造函数
}

Dog.prototype = Object.create(Animal.prototype); // 设置原型链
Dog.prototype.constructor = Dog; // 修正构造函数指向

Dog.prototype.bark = function() {
    console.log(`${this.name} is barking`);
};

const dog = new Dog('Buddy');
dog.move(); // 输出: Buddy is moving
dog.bark(); // 输出: Buddy is barking
方法覆盖

子对象可以覆盖从原型链继承的方法,同时保留对父方法的访问。

Dog.prototype.move = function() {
    Animal.prototype.move.call(this); // 调用父方法
    console.log(`${this.name} is running`);
};

dog.move();
// 输出:
// Buddy is moving
// Buddy is running

5. 原型链和性能

尽管原型链提供了强大的继承和代码复用机制,但在长原型链中查找属性和方法会增加性能开销。因此,应该尽量避免过深的原型链,以提升性能。

6. ES6 类语法

ES6 引入了类语法(class),提供了更清晰、更简洁的方式来定义和继承类,但其底层仍然基于原型链机制。

class Animal {
    constructor(name) {
        this.name = name;
    }
    move() {
        console.log(`${this.name} is moving`);
    }
}

class Dog extends Animal {
    constructor(name) {
        super(name);
    }
    bark() {
        console.log(`${this.name} is barking`);
    }
    move() {
        super.move();
        console.log(`${this.name} is running`);
    }
}

const dog = new Dog('Buddy');
dog.move(); // 输出: Buddy is moving \n Buddy is running
dog.bark(); // 输出: Buddy is barking

小结

  • 原型对象:每个对象都有一个原型对象,访问属性和方法时会首先查找该对象自身,如果未找到则沿着原型链向上查找。
  • __proto__ 属性:对象的隐式属性,指向其构造函数的 prototype 属性。
  • 构造函数的 prototype 属性:每个构造函数都有一个 prototype 属性,包含由该构造函数创建的实例共享的属性和方法。
  • 原型链:对象通过原型链实现继承,当访问一个属性或方法时,沿着原型链查找直到找到该属性或方法或达到顶端 Object.prototype
  • 继承和方法覆盖:通过原型链实现对象继承和方法覆盖,允许子对象覆盖父对象的方法,同时保留对父方法的访问。
  • ES6 类语法:提供了更清晰的类定义和继承语法,但底层仍然基于原型链机制。

原型链机制是理解和掌握 JavaScript 继承和对象行为的关键,通过熟练应用原型链,可以实现灵活且高效的代码复用和扩展。

标签:构造函数,name,对象,JavaScript,原型,机制,prototype,属性
From: https://blog.csdn.net/qq_43733543/article/details/139605913

相关文章

  • 基于事件触发机制的孤岛微电网二次电压与频率协同控制仿真模型(Simulink仿真实现)
    ......
  • fegin的retry机制
    服务间调用如果因为网络原因访问失败了,也可以考虑使用fegin的重发功能来重新访问服务。配置了ribbon或者loadBalance后,重发会根据负载均衡规则寻找新服务。举例:feignServer客户端访问userModel服务(两个节点userModel1,userModel2)如果使用轮询策略(负载均衡)且就爱社userModel1网......
  • 【SPARK-CORE】shuffle机制
    本文主要介绍spark的shuffle机制 shuffle的产生Spark作业被分解为多个Stage,每个Stage包含多个任务(Task)。在需要重新分区的数据操作时因为需要进行数据的交换因此会产生Shuffle边界,即两个Stage之间需要进行Shuffle操作。 shuffle的各个阶段1、shufflemap阶段......
  • SCI一区 | Matlab实现NGO-TCN-BiGRU-Attention北方苍鹰算法优化时间卷积双向门控循环
    要在Matlab中实现NGO-TCN-BiGRU-Attention北方苍鹰算法进行多变量时间序列预测,需要按照以下步骤进行:准备数据:首先,准备多变量时间序列数据。确保数据已经进行了预处理,例如归一化或标准化,以便神经网络能够更好地进行学习和预测。构建NGO-TCN-BiGRU-Attention模型:根据算法的......
  • Python中的垃圾回收机制
    1.引言在现代编程中,垃圾回收是确保程序稳定运行的关键技术之一。Python,作为一种高级编程语言,拥有一套成熟的垃圾回收机制,它在背后默默地管理着内存,确保程序不会因为内存泄漏而崩溃。本文将深入探讨Python中的垃圾回收机制,以及它如何影响我们的代码。2.Python内存管理基......
  • CPU 时间片轮转机制
    CPU时间片轮转机制我们平时在开发的时候,感觉并没有受cpu核心数的限制,想启动线程就启动线程,哪怕是在单核CPU上,为什么?这是因为操作系统提供了一种CPU时间片轮转机制。时间片轮转调度是一种最古老、最简单、最公平且使用最广的算法,又称RR调度。每个进程被分配一个时间段,......
  • JVM类加载机制
    类加载机制概述类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中验证、准备、解析3个部分统称为连接(Link)。初始化的单例......
  • JVM垃圾回收策略机制和算法
    判断对象的存活引用计数法给对象添加一个引用计数器,当对象增加一个引用时计数器加1,引用失效时计数器减1。引用计数为0的对象可被回收。(Python在用,但主流虚拟机没有使用)优点:快,方便,实现简单。缺陷:对象相互引用时(A.instance=B同时B.instance=A),很难判断对象是否该回收。......
  • 【SPARK-CORE】checkpoint机制
    本文主要介绍SPARKRDD的checkpoinnt机制 checkpoint机制介绍checkpoint是讲RDD保存到可靠的存储中的机制,主要目的是提高应用的容错能力和持久性。Checkpointing将数据从内存中转移到磁盘存储,使得在出现节点故障时,Spark可以从存储中恢复数据,而不需要重新计算所有的数据。这......
  • JavaScript实现发布与订阅
    1、代码classEventBus{constructor(){this.events={};}on(event,handler){if(!this.events[event]){this.events[event]=[];}this.events[event].push(handler);}emit(event,data){if(this.events[event]){this.eve......