class其实是function的语法糖,底层继承实现还是基于原型链

news/2024/10/23 7:30:26/

定义在原型上的方法与定义在构造函数内部的方法不同

  function Person(name, age) {this.name = name;this.age = age;}Person.prototype.greet = function() {console.log("Hello, my name is " + this.name);};const person = new Person("Alice", 25);
function Person(name, age) {this.name = name;this.age = age;this.greet = function(){console.log("Hello, my name is " + this.name);}}const person = new Person("Alice", 25);

这两个函数有什么不同?

这两个构造函数的功能是一样的,都可以创建一个具有 nameage 属性以及 greet 方法的 Person 对象。然而,它们的实现方式略有不同:

  1. 在第一个构造函数中,greet 方法是定义在 Person 的原型(prototype)上的。这意味着所有通过该构造函数创建的对象实例都将共享同一个 greet 方法。这种方法更加高效,因为在内存中只有一个 greet 方法的副本。
function Person(name, age) {this.name = name;this.age = age;
}Person.prototype.greet = function() {console.log("Hello, my name is " + this.name);
};const person = new Person("Alice", 25);
  1. 在第二个构造函数中,greet 方法是在构造函数内部作为对象实例的一个属性定义的。这意味着每个通过该构造函数创建的对象实例都会拥有自己的 greet 方法副本。虽然这种实现可以满足功能需求,但它在内存使用上不够高效,因为每个实例都有自己的 greet 方法副本。
function Person(name, age) {this.name = name;this.age = age;this.greet = function() {console.log("Hello, my name is " + this.name);};
}const person = new Person("Alice", 25);

尽管这两个构造函数都可以创建具有相同功能的 Person 对象,但从性能和内存使用的角度来看,第一个构造函数(将方法定义在原型上)是更好的选择。

class底层如何实现的?class是特殊的function?

是的,JavaScript 中的 class 语法实际上是基于原型继承和构造函数的语法糖。底层实现依然是使用构造函数和原型链。class 只是一种更简洁、更易于理解的方式来实现面向对象编程。

当你使用 class 关键字定义一个类时,JavaScript 引擎会在底层创建一个特殊的函数(构造函数)。这个构造函数具有与普通函数相同的行为,但它在语义上被视为一个类。类中定义的方法会被添加到构造函数的原型对象中。

例如,以下是一个使用 class 关键字定义的类:

class Person {constructor(name, age) {this.name = name;this.age = age;}greet() {console.log("Hello, my name is " + this.name);}
}

底层,这个类会被转换为一个与以下代码类似的构造函数和原型对象:

function Person(name, age) {this.name = name;this.age = age;
}Person.prototype.greet = function() {console.log("Hello, my name is " + this.name);
};

class 关键字不仅让代码更简洁易读,还提供了一些额外的功能,如基于类的继承(通过 extends 关键字实现)和访问控制(通过 privatepublic 修饰符实现)。尽管如此,class 的底层实现仍然是基于原型继承和构造函数的。


http://www.ppmy.cn/news/66432.html

相关文章

Ubuntu执行定时命令的方法

简单使用如下 输入下面的命令安装at: sudo apt-get install at输入下面的命令: # e.g. at 22:04 2021-7-7 at [time] [date]接着输入自己想要执行的命令,按CtrlD结束输入。 接着自己的命令即可定时执行。 详细使用 生活中,我…

React 的源码与原理解读(十二):Hooks解读之一 useCallbackuseMemo

写在专栏开头(叠甲) 作者并不是前端技术专家,也只是一名喜欢学习新东西的前端技术小白,想要学习源码只是为了应付急转直下的前端行情和找工作的需要,这篇专栏是作者学习的过程中自己的思考和体会,也有很多参…

Educational Codeforces Round #148 (Rated for Div.2) A~C

A. New Palindrome 题意: 给定一个回文字符串,问是否可以调换其中两个字符,得到另一个不同的回文字符串。 思路: 题目的条件给的宽松,只是询问是否可以调换,并没有要求调换的位置。 方法一:…

LeetCode5. 最长回文子串

写在前面: 题目链接:LeetCode5. 最长回文子串 编程语言:C 题目难度:中等 一、题目描述 给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。 示例…

数据库系统工程师——第三章 数据结构与算法

文章目录 📂 第三章、数据结构与算法 📁 3.1 线性结构 📖 3.1.1 线性表 📖 3.1.2 栈和队列 📖 3.1.3 串 📁 3.2 数组和矩阵 📁 3.3 树和图 📖 3.3.1 树 📖 3.3.2 图 &…

windows 编译 opencv

编译需要的基础工具 #cmake是配置构建工具,mingw是编译工具 cmake CMake是一款跨平台的编译管理工具,可以自动生成各种不同编译环境(如Makefile、Visual Studio Solution等),从而实现在不同平台上进行代码编译的目的…

亲测好用|甲方、专家和领导,用三维模型汇报方案如何投其所好?

身为设计方的你,有没有这样的经历: ➤ 一个非常优秀的方案未能被甲方采纳,反而甲方选择了一个不如自己的方案,造成了很大的遗憾; ➤ 在讲述自己的设计方案的时候,经常越说越散,甚至到了最后自…

MD-MTSP:遗传算法GA求解多仓库多旅行商问题(提供MATLAB代码,可以修改旅行商个数及起点)

一、多仓库多旅行商问题 多旅行商问题(Multiple Traveling Salesman Problem, MTSP)是著名的旅行商问题(Traveling Salesman Problem, TSP)的延伸,多旅行商问题定义为:给定一个𝑛座城市的城市集…