当前位置: 首页 > java >正文

JS中class和构造函数的区别

在JavaScript中,class和构造函数是两种常见的创建对象的方式。虽然class在ES6中被引入,但它背后仍然基于构造函数的原理。然而,class和构造函数在语法和行为上存在一些重要的区别。

一、回顾class的写法

ES6引入了class语法,使得创建类更加直观和简洁。以下是一个简单的class示例:

class Computer {constructor(name, price) {this.name = name;this.price = price;}showSth() {console.log(`这是一台${this.name}电脑`);}static comStruct() {console.log("电脑由显示器,主机,键鼠组成");}
}var apple = new Computer("苹果", 15000);
console.log(apple.name); // 苹果
console.log(apple.price); // 15000
apple.showSth(); // 这是一台苹果电脑
Computer.comStruct(); // 电脑由显示器,主机,键鼠组成

在上面的代码中,我们定义了一个名为Computer的类,该类包含实例属性nameprice,一个原型方法showSth以及一个静态方法comStruct

二、回顾构造函数的写法

在ES6出现之前,我们通常使用构造函数来模拟类。以下是一个等效的ES5写法:

function Computer(name, price) {this.name = name;this.price = price;
}Computer.prototype.showSth = function() {console.log(`这是一台${this.name}电脑`);
};Computer.comStruct = function() {console.log("电脑由显示器,主机,键鼠组成");
};var apple = new Computer("苹果", 15000);
console.log(apple.name); // 苹果
console.log(apple.price); // 15000
apple.showSth(); // 这是一台苹果电脑
Computer.comStruct(); // 电脑由显示器,主机,键鼠组成

在上面的代码中,我们通过构造函数Computer来创建对象,并将方法挂在原型上。

三、class和构造函数的区别

(一)调用方式

构造函数可以通过普通函数调用,而class必须通过new关键字调用。

function Computer2(name, price) {this.name = name;this.price = price;
}var i = Computer2(); // 不会报错,返回undefined
console.log(i); // undefined
class Computer1 {constructor(name, price) {this.name = name;this.price = price;}
}var i = Computer1(); // 报错
// TypeError: Class constructor Computer1 cannot be invoked without 'new'

(二)枚举性

ES6中的class方法默认是不可枚举的,而ES5中的原型方法是可枚举的。

var apple = new Computer2("苹果", 15000);
for (var i in apple) {console.log(i); // name, price, showSth
}var huawei = new Computer1("华为", 12000);
for (var i in huawei) {console.log(i); // name, price
}

(三)严格模式

ES6的class内部默认是严格模式,而ES5的构造函数不是。

class Computer1 {showSth(i, i) { // 报错console.log(`这是一台${this.name}电脑`);}
}function Computer2(name, price) {this.name = name;this.price = price;
}Computer2.prototype.showSth = function(i, i) { // 不会报错console.log(`这是一台${this.name}电脑`);
};

(四)原型方法的调用

ES6的class原型方法不能通过new调用,而ES5的原型方法可以。

var apple = new Computer2("苹果", 15000);
var i = new apple.showSth(); // 不会报错,返回一个空对象
console.log(i); // {}
var huawei = new Computer1("华为", 12000);
var i = new huawei.showSth(); // 报错
// TypeError: huawei.showSth is not a constructor
http://www.xdnf.cn/news/9851.html

相关文章:

  • Selenium 测试框架 - Kotlin
  • 制造企业搭建AI智能生产线怎么部署?
  • .NET WinForm图像识别二维码/条形码并读取其中内容
  • 01.认识Kubernetes
  • 广告流量监测和IP地址离线库
  • Nexus仓库数据高可用备份与恢复方案(下)
  • 苹果FINDMY和谷歌FIND HUB增强共享位置功能
  • offset 家族和 client 家族
  • 【第4章 图像与视频】4.1 图像的绘制
  • Next.js 布局(Layout)与模板(Template)深度解析:从原理到实战
  • 在VirtualBox中打造高效开发环境:CentOS虚拟机安装与优化指南
  • SQL正则表达式总结
  • Java面试实战:从Spring到大数据的全栈挑战
  • STM32中,如何理解看门狗
  • WebSocket与实时对话式AI服务的集成
  • MySQL ALTER TABLE 组合操作时导致的错误
  • GPU 图形计算综述 (二):固定管线
  • dto vo类为什么要序列化?
  • 相量法正弦稳态电路的分析(面向题目)
  • 从汇编的角度揭秘C++函数重载,原来这么简单
  • 【最小生成树】Prim 算法、Kruskal 算法
  • 基于vue框架的独居老人上门护理小程序的设计r322q(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 42道CSS高频题整理(附答案背诵版)
  • Java AQS(Abstract Queued Synchronized)深度解析
  • MyBatisPlus(2):常用注解
  • 【MATLAB例程】基于脉冲雷达的TDOA目标定位,适用于四个锚点、三维空间的环境,附代码下载链接
  • 亚远景-ASPICE与ISO 26262:适用范围与应用场景的差异分析
  • 国产化redis 替代产品tendis 安装
  • 1Panel v2 首发体验(alpha)
  • Ubuntu 24.04 LTS Chrome 中文输入法(搜狗等)失效?一行命令解决