【JavaScript】原型

在 JavaScript 中,每个对象都有一个原型(prototype),它是一个对象本身,而不是一个函数。原型机制是 JavaScript 的核心特性之一,它允许对象继承另一个对象的属性和方法。

以下是关于 JavaScript 原型的基本概念和用法:

  1. 原型链:

    每个对象都有一个原型,而原型本身也是一个对象,因此可以形成一个原型链。当访问一个对象的属性或方法时,JavaScript 首先在对象本身查找,然后在其原型上查找,如果还没有找到,就会继续在原型的原型上查找,以此类推,直到找到或者到达原型链的末端。

  2. prototype 属性:

    在 JavaScript 中,构造函数(函数用于创建对象)有一个 prototype 属性,它是一个对象,用于存储该构造函数的实例共享的属性和方法。当使用构造函数创建对象时,对象会继承构造函数的 prototype 对象的属性和方法。

  3. __proto__ 属性:

    每个对象都有一个 __proto__ 属性,它指向对象的原型。通过 __proto__ 属性,可以访问对象的原型上的属性和方法。

  4. 原型的继承:

    当访问一个对象的属性或方法时,如果对象本身没有,JavaScript 会沿着原型链查找,直到找到或者到达原型链的末端。这就实现了属性和方法的继承。

以下是一个简单的示例,展示了原型的概念:

javascript 复制代码
// 构造函数
function Person(name) {
  this.name = name;
}

// 在构造函数的 prototype 上添加方法
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

// 使用 __proto__ 访问原型
console.log(person1.__proto__ === Person.prototype); // true
console.log(person2.__proto__ === Person.prototype); // true

在这个示例中,Person 是一个构造函数,Person.prototype 是一个对象,我们将方法 sayHello 添加到了 Person.prototype 上。当创建 person1 和 person2 对象时,它们继承了 Person.prototype 的属性和方法,因此可以调用 sayHello 方法。

类的原型对象:

类是构造函数的语法糖,因此类的实例化过程实际上也是通过构造函数来创建对象的,因此类和构造函数都具有原型的概念。

在类中,类的原型可以被称为类的原型对象(class prototype object),它类似于构造函数的原型。类的实例会继承类的原型对象上的方法和属性,类似于使用构造函数创建的对象会继承构造函数的原型上的方法和属性。

下面是一个简单的示例,展示了类的原型的概念:

javascript 复制代码
class Person {
  constructor(name) {
    this.name = name;
  }

  sayHello() {
    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.__proto__ === Person.prototype); // true
console.log(person2.__proto__ === Person.prototype); // true

在这个示例中,Person 是一个类,Person.prototype 是类的原型对象,我们在类中定义了方法 sayHello,该方法被添加到了 Person.prototype 上。当创建 person1 和 person2 对象时,它们继承了 Person.prototype 的属性和方法,因此可以调用 sayHello 方法。

总之,类和构造函数都具有原型的概念,类的实例化过程实际上也是通过构造函数来实现的,因此类的原型在类的继承和方法共享方面具有重要作用。

相关推荐
量化分析码农43 分钟前
股票历史数据的复权参数对照:多级别返回的字段与数值差异
java·javascript·后端
熊猫钓鱼>_>1 小时前
普通用户视角的端侧智能体验手记【鸿蒙心迹】
开发语言·人工智能·华为·智能手机·性能优化·ai编程·harmonyos
瑞雪兆丰年兮1 小时前
JavaWeb-day13-SpringBootWeb事务管理&AOP
java·开发语言·springboot·javaweb·事务·web·aop
天才熊猫君3 小时前
给 Vue 的 reactive 套 Proxy,为什么响应式会失灵?
前端·javascript
布莱克6053 小时前
Swift 常量详解:从 let 到编译期优化
服务器·开发语言·ssh·swift·常量·let
布莱克6053 小时前
Swift 可选类型(Optionals)详解:从原理到实战
开发语言·安全·ssh·swift·optional·可选类型
用户2763965765105 小时前
放弃 JWT 后,我给 FastAPI 游戏服务端手撸了一套 token session
javascript
瑞雪兆丰年兮5 小时前
JavaWeb-day14-SpringBootWeb原理篇
java·开发语言·spring boot·spring·bean·mybatis·javaweb
用户84298142418106 小时前
从 JavaScript 到可运行的字节码 - ByteJS 使用指南
javascript
学以智用6 小时前
wangEditor V5 精简完整参考手册
javascript