0

0

JavaScript面向对象编程的三种实现方式

紅蓮之龍

紅蓮之龍

发布时间:2025-09-18 22:14:01

|

1009人浏览过

|

来源于php中文网

原创

javascript面向对象编程的三种实现方式

JavaScript面向对象编程主要通过原型链、构造函数和ES6的class语法来实现。它们各有特点,也适用于不同的场景。

原型链、构造函数、ES6 Class。

原型链是如何实现继承的?

原型链的核心在于每个JavaScript对象都有一个指向其原型对象的内部链接,这个原型对象又有自己的原型,以此类推,直到到达

null
。当试图访问一个对象的属性时,如果该对象自身没有这个属性,JavaScript引擎会沿着原型链向上查找,直到找到该属性或者到达原型链的末端。

举个例子,假设我们有一个

Animal
构造函数和一个
Dog
构造函数,我们想让
Dog
继承
Animal
的属性。我们可以这样做:

立即学习Java免费学习笔记(深入)”;

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

Animal.prototype.sayHello = function() {
  console.log("Hello, I'm " + this.name);
};

function Dog(name, breed) {
  Animal.call(this, name); // 调用Animal构造函数,设置Dog的name属性
  this.breed = breed;
}

// 设置Dog的原型为Animal的实例,Dog就可以继承Animal原型上的方法
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog; // 修复Dog的constructor指向

Dog.prototype.bark = function() {
  console.log("Woof!");
};

const myDog = new Dog("Buddy", "Golden Retriever");
myDog.sayHello(); // 输出 "Hello, I'm Buddy"
myDog.bark();    // 输出 "Woof!"

在这个例子中,

Dog.prototype = Object.create(Animal.prototype)
是关键。它创建了一个新的对象,这个对象的原型是
Animal.prototype
,然后将
Dog.prototype
指向这个新对象。这样,
Dog
的实例就可以访问
Animal
原型上的
sayHello
方法。
Animal.call(this, name)
的作用是确保
Dog
的实例拥有
Animal
构造函数中定义的属性,例如
name

需要注意的是,原型链查找属性的过程是动态的。如果在创建对象之后修改了原型对象,那么所有基于该原型创建的对象都会受到影响。

构造函数模式的优缺点是什么?

构造函数模式是JavaScript中创建对象的一种常用方式。它通过

new
关键字来创建一个新的对象,并将构造函数中的属性和方法绑定到这个新对象上。

优点:

  • 创建多个相似对象: 构造函数可以用来创建多个具有相同属性和方法的对象实例。
  • 实例独立性: 每个实例都拥有自己的属性和方法副本,修改一个实例不会影响其他实例。
  • 可以自定义属性和方法: 可以在构造函数中根据传入的参数来设置不同的属性值,从而创建具有不同状态的对象。

缺点:

绿叶网络企业网站
绿叶网络企业网站

界面淡雅,从企业介绍、产品介绍、留言反馈、新闻发布、客户服务等方面,全方位、立体式的展示企业的各种情况,主要强调产品优势和售后服务,符合现在最新的营销理念(企业销售的不仅是产品,还有服务),“友情链接”栏目是为了企业开展网上营销的必要手段,后台采用新的编辑器,不但能修改网页的文字颜色、大小、字体、对齐方式(使用起来就象WORD),还能插入图片、FLASH动画

下载
  • 方法重复创建: 构造函数中定义的方法会在每个实例中都创建一份副本,造成内存浪费。如果大量创建对象,会显著影响性能。
  • 无法实现继承: 构造函数本身无法直接实现继承,需要借助原型链等方式来实现。
  • 类型判断困难: 使用构造函数创建的对象,其类型判断可能会比较复杂,需要使用
    instanceof
    运算符。

为了解决方法重复创建的问题,通常会将方法定义在原型对象上,而不是构造函数内部。这样,所有实例共享同一个方法,节省内存。

例如:

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

Person.prototype.sayHello = function() {
  console.log("Hello, my name is " + this.name + " and I'm " + this.age + " years old.");
};

const person1 = new Person("Alice", 30);
const person2 = new Person("Bob", 25);

person1.sayHello(); // 输出 "Hello, my name is Alice and I'm 30 years old."
person2.sayHello(); // 输出 "Hello, my name is Bob and I'm 25 years old."

在这个例子中,

sayHello
方法只在
Person.prototype
上定义了一次,所有
Person
的实例都可以访问到这个方法,避免了重复创建。

ES6的class语法糖背后是什么?

ES6 引入的

class
关键字提供了一种更简洁、更易于理解的语法来定义类和实现继承。但本质上,它仍然是基于原型链的语法糖。
class
关键字并没有引入新的面向对象模型,它只是对原型链的一种封装。

class
声明实际上创建了一个函数,这个函数就是类的构造函数。类中定义的方法会被添加到构造函数的
prototype
属性上。

例如:

class Animal {
  constructor(name) {
    this.name = name;
  }

  sayHello() {
    console.log("Hello, I'm " + this.name);
  }
}

class Dog extends Animal {
  constructor(name, breed) {
    super(name); // 调用父类的构造函数
    this.breed = breed;
  }

  bark() {
    console.log("Woof!");
  }
}

const myDog = new Dog("Buddy", "Golden Retriever");
myDog.sayHello(); // 输出 "Hello, I'm Buddy"
myDog.bark();    // 输出 "Woof!"

console.log(typeof Animal); // 输出 "function"
console.log(Animal.prototype.constructor === Animal); // 输出 true

在这个例子中,

Animal
Dog
都是函数。
extends
关键字实现了继承,它相当于设置了
Dog.prototype.__proto__ = Animal.prototype
super()
函数用于调用父类的构造函数,确保子类实例拥有父类的属性。

class
语法糖的优点在于:

  • 更清晰的语法:
    class
    关键字提供了一种更易于理解和维护的语法来定义类和实现继承。
  • 更好的可读性:
    class
    语法使代码更易于阅读和理解,尤其是在处理复杂的继承关系时。
  • 更强的类型检查:
    class
    语法可以与 TypeScript 等类型检查工具配合使用,提供更强的类型安全。

虽然

class
语法糖简化了面向对象编程,但理解原型链的本质仍然很重要。这有助于更深入地理解 JavaScript 的工作原理,并更好地解决实际问题。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
es6新特性
es6新特性

es6新特性有:1、块级作用域变量;2、箭头函数;3、模板字符串;4、解构赋值;5、默认参数;6、 扩展运算符;7、 类和继承;8、Promise。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

103

2023.07.17

es6新特性有哪些
es6新特性有哪些

es6的新特性有:1、块级作用域;2、箭头函数;3、解构赋值;4、默认参数;5、扩展运算符;6、模板字符串;7、类和模块;8、迭代器和生成器;9、Promise对象;10、模块化导入和导出等等。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

195

2023.08.04

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

222

2025.12.24

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

236

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

458

2024.03.01

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1501

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

232

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

87

2025.10.17

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 5万人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8万人学习

MongoDB 教程
MongoDB 教程

共17课时 | 2.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号