类和函数的不同之处

这篇具有很好参考价值的文章主要介绍了类和函数的不同之处。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

60. 类和函数的不同之处

1. 创建方式不同
  • 函数可以通过函数表达式或函数声明来创建:
// 函数声明
function greet(name) {
  console.log(`Hello, ${name}!`);
}

// 函数表达式
const add = function (x, y) {
  return x + y;
};
  • 则是通过 class 关键字来创建:
class Person {
  constructor(name) {
    this.name = name;
  }

  sayHello() {
    console.log(`Hello, my name is ${this.name}.`);
  }
}
2. 对象创建方式不同
  • 通过函数创建的对象可以使用函数调用运算符 () 来创建:
function Person(name) {
  this.name = name;
}

const person1 = new Person('Alice');
const person2 = Person('Bob');
  • 而通过创建的对象必须使用 new 运算符来创建:
class Person {
  constructor(name) {
    this.name = name;
  }

  sayHello() {
    console.log(`Hello, my name is ${this.name}.`);
  }
}

const person1 = new Person('Alice');
const person2 = Person('Bob'); // 报错:Class constructor Person cannot be invoked without 'new'
3. 继承方式不同
  • JavaScript 中,函数使用原型链来实现继承:
function Animal(name) {
  this.name = name;
}

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

function Cat(name) {
  Animal.call(this, name);
}

Cat.prototype = Object.create(Animal.prototype);
Cat.prototype.constructor = Cat;

Cat.prototype.meow = function () {
  console.log(`Meow, I am ${this.name}.`);
}

const cat = new Cat('Tom');
cat.sayHello(); // 输出 "Hello, I am Tom."
cat.meow(); // 输出 "Meow, I am Tom."
  • 而类使用 extends 关键字来实现继承,并且还可以使用 super 关键字来访问父类的方法和属性:
class Animal {
  constructor(name) {
    this.name = name;
  }

  sayHello() {
    console.log(`Hello, I am ${this.name}.`);
  }
}

class Cat extends Animal {
  constructor(name) {
    super(name);
  }

  meow() {
    console.log(`Meow, I am ${this.name}.`);
  }
}

const cat = new Cat('Tom');
cat.sayHello(); // 输出 "Hello, I am Tom."
cat.meow(); // 输出 "Meow, I am Tom."
4. 构造函数不同
  • 函数中,可以使用构造函数来创建对象,但是这个构造函数与函数名称相同:
function Person(name) {
  this.name = name;
}

const person = new Person('Alice');
  • 而在中,类名称本身就是构造函数,使用 new 关键字来创建对象时,会调用该类的构造函数:
class Person {
  constructor(name) {
    this.name = name;
  }
}

const person = new Person('Alice');
5. 方法定义方式不同
  • 函数中,可以使用函数表达式或函数声明来定义方法:
function Person(name) {
  this.name = name;
}

Person.prototype.sayHello = function () {
  console.log(Hello, my name is ${this.name}.);
};

const person = new Person('Alice');
person.sayHello();
  • 而在中,可以直接在类体中定义方法:
class Person {
  constructor(name) {
    this.name = name;
  }

  sayHello() {
    console.log(Hello, my name is ${this.name}.);
  }
}

const person = new Person('Alice');
person.sayHello();
6. 静态方法定义方式不同
  • 函数中,可以使用对象字面量来定义静态方法:
function Person(name) {
  this.name = name;
}

Person.sayHello = function () {
  console.log('Hello, world!');
};

const person = new Person('Alice');
Person.sayHello();
  • 而在中,可以使用 static 关键字来定义静态方法:
class Person {
  constructor(name) {
    this.name = name;
  }

  static sayHello() {
    console.log('Hello, world!');
  }
}

const person = new Person('Alice');
Person.sayHello();
7. 类中的属性和方法默认为不可枚举

在类中,定义的属性和方法默认情况下是不可枚举的,而在函数中,定义的属性和方法默认是可枚举的。这意味着,使用 for...in 循环无法遍历类中的属性和方法,需要使用 Object.keys() 方法获取类中的属性和方法。

例如,在下面的代码中,我们定义了一个类和一个函数,它们都包含一个属性和一个方法:

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

  sayHello() {
    console.log(`Hello, my name is ${this.name}.`);
  }
}

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

PersonFunc.prototype.sayHello = function () {
  console.log(`Hello, my name is ${this.name}.`);
};

const person = new Person('Alice');
const personFunc = new PersonFunc('Bob');

console.log(Object.keys(person));       // []
console.log(Object.keys(personFunc));   // ['name']

for (const key in person) {
  console.log(key);   // undefined
}

for (const key in personFunc) {
  console.log(key);   // 'name' 和 'sayHello'
}

在类中,属性和方法默认是不可枚举的,因此使用 Object.keys() 方法无法获取属性和方法。而在函数中,属性和方法默认是可枚举的,因此使用 for...in 循环可以遍历所有的属性和方法。

8. 类不能被调用

JavaScript 中,函数可以被当做构造函数使用,通过使用 new 运算符可以创建一个新的对象。而类不能被直接调用,必须通过使用 new 运算符来创建对象。

例如,在下面的代码中,我们尝试直接调用类:

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

  sayHello() {
    console.log(`Hello, my name is ${this.name}.`);
  }
}

Person('Alice');   // TypeError: Class constructor Person cannot be invoked without 'new'

运行上面的代码会抛出一个 TypeError 错误,因为类不能被直接调用。

9. 类方法是严格模式下执行

中,所有的方法(包括静态方法和实例方法)都是在严格模式下执行,而在函数中,如果不显式声明为严格模式,方法就会在非严格模式下执行。

总之,函数JavaScript 中都扮演着重要的角色,各有不同的特点和用途。需要根据实际情况选择使用哪个。文章来源地址https://www.toymoban.com/news/detail-471423.html

到了这里,关于类和函数的不同之处的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 科普知识:HTTP vs HTTPS的不同之处

    今天看到一条新闻,说是银联提醒用户注意网站的https前缀: 在识别网络诈骗方面,银联特别提醒任何网购退款均无需提供银行卡密码和CVN2。任何索要短信验证码的行为都是诈骗。在登录网址时,警惕所谓的“安全中心”“认证中心”,不要轻信“低价”购物网站,并警惕通

    2024年02月08日
    浏览(38)
  • 传统交换机当今交换机不同之处分析

    目前市场上的某些交换机号称具有QoS保证,实际上只支持单级别的优先级设置,在逻辑上不形成环路,而一旦出现故障,启用备份链路,在这里拿出来和大家分享一下,希望对大家有用。 我们经常说到的以太网传统交换机实际是一个基于网桥技术的多端口第二层网络设备,它

    2024年02月05日
    浏览(32)
  • ChatGPT和其他自然语言处理模型有什么不同之处?

    ChatGPT是一种基于变压器神经网络的自然语言生成模型,与传统的语言模型和其他自然语言处理模型相比,具有以下几个显著的不同之处: 1.能够生成连贯、长文本 传统的语言模型(如N-gram模型)通常只能生成短文本,而生成长文本时容易出现重复或不连贯的情况。而ChatGPT使

    2024年02月11日
    浏览(35)
  • Web2与Web3开发的不同之处

    Web2是引入交互功能的第二代互联网,也是我们今天所熟悉的。随着Web的不断发展,第三代互联网,也被称为Web3,正处于积极开发中。Web3引入了在区块链上运行的去中心化和无需许可的系统。但是Web2和Web3开发之间有什么区别呢?这对于从Web2转变到Web3的开发者是个契机,不仅

    2024年02月05日
    浏览(30)
  • 【博客647】MetricsQL(VictoriaMetrics)和PromQL(Prometheus)的不同之处

    https://valyala.medium.com/promql-tutorial-for-beginners-9ab455142085 2-1、MetricsQL 考虑了方括号中窗口之前的前一个点,用于范围函数,例如速率和增加。这允许返回用户对 increase(metric[$__interval]) 查询期望的准确结果,而不是 Prometheus 为此类查询返回的不完整结果 2-2、MetricsQL不推断范围函数

    2024年02月08日
    浏览(43)
  • 【JAVA】数据类型与变量(主要学习与c语言不同之处)

    ✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:橘橙黄又青-CSDN博客 目标: 1. 字面常量 2. 数据类型 3. 变量 在上节课 HelloWorld 程序中, System.Out.println(\\\"Hello World\\\") ; 语句,不论程序何时运行,输出的都是 Hello World,其实 \\\"Hello Wo

    2024年03月28日
    浏览(36)
  • TDSCDMA和TDLTE有什么区别 SCDMA和LTE不同之处

    最近,关于TD-SCDMA的话题很多。观点无非就是支持和反对两派,大有清算历史旧账之势。个人以为,TD-SCDMA本身确实是失败的,至少群众的眼睛是雪亮的。但也不能完全否定了TD-SCDMA的功劳,它是不是TD-LTE发展壮大的关键,不好说,但至少为TD-LTE奠定了一个基础。 否定TD-SCDMA之

    2024年02月07日
    浏览(35)
  • ARM-Linux开发与MCU开发的不同之处分析

    目录 一、ARM-Linux应用开发和单片机开发的不同 二、Arm-Linux基本开发环境 针对ARM-Linux程序的开发,主要分为三类:应用程序开发、驱动程序开发、系统内核开发。针对不同种类的软件开发,有其不同的特点。 今天,我们来看看ARM-Linux开发和MCU开发的不同点,以及ARM-Linux的基本

    2024年02月10日
    浏览(36)
  • 腾讯云轻量服务器和云服务器区别12点不同之处

    关于腾讯云轻量应用服务器和云服务器CVM的区别,之前腾讯云百科写过一篇文章来对比,阿腾云又更新了一篇新的区别对比文章,比之前的要更加详细,包括轻量服务器的使用限制、CPU型号、公网限制月流量、内网连通性、硬盘存储等多方面对比: 目录 腾讯云轻量应用服务

    2023年04月08日
    浏览(45)
  • 路由器IP指派DHCP和BOOTP不同之处和优缺点对比

    DHCP (Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段,在RFC 2131中有详细的描述。DHCP有3个端口,其中

    2024年02月07日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包