Javascript中类的实现

本文探讨JavaScript如何通过原型实现类和继承,包括ES5的构造函数法和ES6的class关键字。虽然ES6的class是语法糖,但其本质仍基于原型继承。文章深入分析了继承的实现,如原型链、构造函数继承、组合继承和寄生组合继承,并解释了super(props)的用途。总结指出,JavaScript没有真正的类,而是通过模拟实现类行为。
摘要由CSDN通过智能技术生成

前言

最近在读《你不知道的Javascript》 系列,读到关于原型和类的部分,里面提到一个观点:js中只有对象,没有类这个概念。
在网上搜索关于“Javascript” 中是否有类 的问题,有很多争议。
一段比较准确的描述是:

在ECMAScript 6出现class的概念之后,才算是告别了直接通过原型对象来模拟类和类继承,但class也只是基于JavaScript原型继承的语法糖,并没有引入新的对象继承模式。

这篇文章并不是为 Js是否有"类" 这个问题盖棺定论,而是看Js具体是如何通过原型实现传统 面向对象语言class关键字的功能的。

阅读本篇前,你需要提前了解什么是真正的类和面向对象编程思想,以及js的原型链设计。

我们开始吧。

Js是如何实现类的

es 5: 构造函数法

用构造函数模拟“类”,在其内部用this关键字指代实例对象,用 new 关键字生成实例。

function Cat(){
   
  this.name = "大毛"//作为构造函数被调用时,this指向实例,这里定义了实例的属性
}

// 定义在 构造函数 原型链上的属性和方法,被所有实例共享,是同一个值(引用)
Cat.prototype.makeSound = function(){
   
    alert("喵喵喵");
} 

es 6: class关键字

class Animal {
   
  constructor(name,age){
   
    this.name = name;
    this.age = age;
    this.move= function(){
   };
  }
  
  static sleep(){
   
    console.log('sleeping')
  }
  
  speakSomething(){
   
    console.log(123)
  }
  
  //公共属性,转译配置需要插件 plugin-proposal-calss-properties
  height = 0;
}

经过babel转译后看到的代码如下(babel preset: es2015-loose):

"use strict";

function _defineProperty(obj, key, value) {
    if (key in obj) {
    Object.defineProperty(obj, key, {
    value: value
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值