首页 > 其他分享 >JS的原型和原型链浅析

JS的原型和原型链浅析

时间:2024-12-18 21:32:48浏览次数:6  
标签:name myDog Dog JS 原型 Animal prototype 浅析

原型与原型链

在 JavaScript 中,原型(Prototype)是对象的一种特殊类型,它是所有对象共享属性和方法的机制。每一个 JavaScript 对象都与一个原型对象相关联,并且通过原型链来继承属性和方法。

1. 原型(Prototype)

每个对象在创建时都会有一个内部属性 [[Prototype]],它指向该对象的原型。在 JavaScript 中,原型通常通过 __proto__ 属性访问,或者可以通过 Object.getPrototypeOf() 方法获取。

原型本质上是一个普通对象,拥有可以共享的属性和方法。对象通过它的原型来访问这些共享的属性和方法。

2. 原型链(Prototype Chain)

原型链是一种链式结构,通过一个对象的 [[Prototype]] 属性将多个对象链接起来。当你访问对象的属性时,如果该对象本身没有这个属性,它会沿着原型链查找该属性,直到找到为止。如果原型链的末端仍然没有该属性,则返回 undefined

代码示例

创建对象与原型链
// 构造函数
function Animal(name) {
  this.name = name;
}

// 在原型上定义一个方法
Animal.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}`);
};

// 创建一个 Animal 对象
const dog = new Animal('Dog');

// 通过实例访问原型方法
dog.sayHello();  // Output: Hello, my name is Dog

// 查看dog的原型
console.log(dog.__proto__ === Animal.prototype);  // true

解析:

  1. Animal.prototype 定义了 sayHello 方法,这个方法并不是直接在实例 dog 上定义的,而是通过原型链来访问的。
  2. 当我们调用 dog.sayHello() 时,JavaScript 引擎会先查看 dog 是否有 sayHello 方法,如果没有,则沿着原型链去 Animal.prototype 上找。
  3. 由于 dog 是通过 Animal 构造函数创建的,所以 dog.__proto__Animal.prototype
原型链的查找机制
function Animal(name) {
  this.name = name;
}

Animal.prototype.sayHello = function() {
  console.log(`Hello from ${this.name}`);
};

function Dog(name, breed) {
  Animal.call(this, name);  // 继承 Animal 的属性
  this.breed = breed;
}

// 继承 Animal 的方法
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;

Dog.prototype.bark = function() {
  console.log(`${this.name} says Woof!`);
};

const myDog = new Dog('Max', 'Golden Retriever');

myDog.sayHello(); // Hello from Max
myDog.bark();     // Max says Woof!

解析:

  1. Dog 通过 Object.create(Animal.prototype) 来继承 Animal 的原型方法。
  2. myDog 对象继承了 Animal 的方法 sayHelloDog 的方法 bark
  3. myDog.sayHello() 调用时,JavaScript 引擎沿着原型链查找,首先找到 Dog.prototype 上的 sayHello 方法。
instanceof 运算符

instanceof 用于检查对象是否为某个构造函数的实例。它基于原型链工作,检查对象的原型链中是否有构造函数的 prototype 属性。

console.log(myDog instanceof Dog);   // true
console.log(myDog instanceof Animal); // true
console.log(myDog instanceof Object); // true

解析:

  1. myDog instanceof Dog 返回 true,因为 myDogDog 的实例,且 Dog.prototype 存在于 myDog 的原型链中。
  2. myDog instanceof Animal 也返回 true,因为 Dog.prototype 继承自 Animal.prototype,所以 myDog 的原型链也包含 Animal.prototype

原型的应用场景

1. 方法共享

通过将方法定义在构造函数的原型上,多个实例对象可以共享相同的功能,而不需要每次创建对象时都重新定义方法,从而节省内存空间。

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

// 共享方法
Person.prototype.greet = function() {
  console.log(`Hello, my name is ${this.name}`);
};

const p1 = new Person('Alice');
const p2 = new Person('Bob');

p1.greet(); // Hello, my name is Alice
p2.greet(); // Hello, my name is Bob
2. 模拟继承

原型链机制是 JavaScript 实现继承的一种方式。通过修改构造函数的原型,我们可以实现不同类型之间的继承。

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

Shape.prototype.describe = function() {
  console.log(`This is a ${this.name}`);
};

function Circle(name, radius) {
  Shape.call(this, name);
  this.radius = radius;
}

Circle.prototype = Object.create(Shape.prototype);
Circle.prototype.constructor = Circle;

Circle.prototype.area = function() {
  return Math.PI * this.radius * this.radius;
};

const myCircle = new Circle('Circle', 5);
myCircle.describe(); // This is a Circle
console.log(myCircle.area()); // 78.53981633974483

解析:

  1. Circle 通过 Object.create(Shape.prototype) 继承了 Shape 的方法 describe
  2. Circle 添加了自己的方法 area,实现了继承的同时扩展了新方法。

总结

  • 原型(Prototype) 是对象的一个内部属性,每个对象都有一个与之关联的原型,原型是对象共享方法和属性的机制。
  • 原型链(Prototype Chain) 是多个对象通过原型属性连接起来的链式结构,访问对象属性时会沿着原型链逐级查找。
  • 常见应用场景包括方法共享模拟继承等。

通过理解原型和原型链的机制,我们可以更加高效地管理对象的属性和方法,利用继承和共享减少内存开销,提高代码的复用性和可维护性。

标签:name,myDog,Dog,JS,原型,Animal,prototype,浅析
From: https://blog.csdn.net/cuijiying/article/details/144569860

相关文章

  • 7套电商行业原型:社交型、平台型、O2O、连锁店多细类原型
    小编整理不易,请大家多多支持!备注:7套电商行业原型目录内容介绍 2C电商平台交互原型(Web端).rp电商APP交互高保真原型(移动端).rp订单结算系统原型.rp拍卖平台界面原型(小程序).rp社区新零售O2O电商系统.rp线上游戏式团购电商平台.rp移动电商界面框架流(电商+......
  • node.js的简单示例
    Node.js是一个基于ChromeV8引擎的JavaScript运行时环境,用于方便地构建快速、可扩展的网络应用。下面是一个简单的Node.js示例,它创建了一个简单的HTTP服务器,当访问服务器时,它会响应“HelloWorld”//引入Node.js的HTTP模块consthttp=require('http');//创建HTTP服务......
  • DeepFaceLab技术浅析(一)
    DeepFaceLab(DFL)是一款开源且功能强大的深度学习工具,主要用于视频中的面部替换(也称为“深度换脸”或“deepfake”)。它利用先进的深度学习技术,通过训练神经网络模型来实现面部特征的高精度替换。一、数据预处理模块1.1视频分解与帧提取工具:FFmpeg功能:将输入的视频分解为单独......
  • Showrunner AI技术浅析(四):多智能体模拟
    多智能体模拟技术涉及多个智能体(Agents)在虚拟环境中的行为和互动,每个智能体都有自己的属性、目标和行为规则。1.多智能体模拟概述多智能体模拟技术通过模拟多个智能体在虚拟环境中的互动来生成复杂的剧情和场景。每个智能体都有其独特的属性和行为逻辑,通过与环境和其他智能......
  • nodejs安装及环境配置详细教程
    ‌Node.js的安装和环境配置可以通过以下步骤完成‌:‌下载和安装Node.js‌:首先,访问[Node.js官网](https:odejs.org/)下载适合您操作系统的安装包。对于Windows系统,可以选择.exe文件进行安装。安装时,可以选择自定义安装路径,通常建议将其安装在非系统盘以避免占用C盘空间。‌......
  • node.js毕设基于android的课堂考勤管理系统 论文+程序
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于课堂考勤管理系统的研究,现有研究主要集中在传统的考勤方式或者基于PC端的管理系统,专门针对基于Android平台的课堂考勤管理系统的研究较少。在国内外......
  • node.js毕设机器人编程平台的设计与实现 论文+程序
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于毕设机器人编程平台的设计与实现这一课题,在当前的国内外研究中,现有的研究主要集中在通用编程平台的开发与优化方面,对于专门针对毕业设计场景下的机......
  • EasyPlayer.js网页全终端安防视频流媒体播放器Web播放H.265要兼顾哪些方面?
    在数字化时代,流媒体技术已经成为信息传播和娱乐消费的重要方式。随着互联网技术的飞速发展和移动设备的普及,流媒体服务正在重塑我们的生活和工作方式。从视频点播、在线直播到音乐流媒体,流媒体技术的广泛应用不仅改变了内容的分发和消费模式,也为内容创作者和消费者提供了前所未有......
  • 无插件直播流媒体音视频播放器EasyPlayer.js是否支持WebRTC使用
    随着5G技术的普及和互联网技术的进一步发展,H5流媒体播放器将迎来更加广阔的发展前景。一方面,5G技术将实现更高的传输速度和更低的延迟,为用户提供更加流畅、稳定的播放体验。另一方面,随着互动功能的不断丰富和完善,H5流媒体播放器将更好地满足用户的个性化需求。那么EasyPlayer.js......
  • golang 使用gzip对json例子
    packagemainimport(  "bytes"  "compress/gzip"  "encoding/json"  "fmt"  "io"  "log")//User结构体定义typeUserstruct{  ID int  `json:"id"`  Namestring......