javascript-class使用和实现原理

【Vue.js 3.0源码】Transition 组件:过渡动画的实现原理是怎样的? 作为一名前端开发工程师,平时开发页面少不了要写一些过渡动画,通常可以用CSS脚本来实现,当然一些时候也会使用JavaScript操作DOM来实现动画。那么,如果我们使用Vue.js技术栈,有没有好的实现动画的方式呢?Vue.js提供了内置的Transition组件,它可以让我们轻松实现动画过渡效果。Transition组件是如何渲染的,如何执行过渡动画和相应的钩子函数的,以及当两个视图切换时,模式的工作原理是怎样的。... 阅读详情

class

其实 es6 的 class 就是一个语法糖,是基于原型去实现的。先创建一个关于 Animal 的类

class Animal {
  constructor(name) {
    // 这里面的this会指向实例
    this.name = name;
  }
  static parentName = "Animal"; // 静态属性
  static getParentName() {
    // 1.静态方法的this只会指向父类
    // 2.可以通过父类调用
    // 3.静态方法不能被实例继承,但可以被子类继承
    console.log(this.parentName);
    return this.parentName;
  }
  getName() {
    console.log(this.name);
    return this.name;
  }
}
class Cat extends Animal {
  constructor(name, age) {
    super(name); // 相当于 Animal.prototype.constructor.call(this, name, age)
    this.age = age;
  }
  getItsName() {
    super.getName(); // 相当于 Animal.prototype.getName()
  }
}

实现

function createClass(Constructor, protoProps, staticProps) {
  if (protoProps) {
    Object.defineProperties(Constructor.prototype, protoProps);
  }
  if (staticProps) {
    Object.defineProperties(Constructor, staticProps);
  }
  return Constructor;
}
function Animal(name) {
  // 实例属性赋值
  this.name = name;
}

// 在构造函数的原型对象上挂载实例方法
createClass(
  Animal,
  {
    getName: {
      value: function getName() {
        console.log("调用实例方法,获取实例属性", this.name);
        return this.name;
      },
    },
  },
  {
    getParentName: {
      // 在构造函数上挂载静态属性和方法
      value: function getParentName() {
        console.log("调用静态方法,获取静态属性", this.parentName);
        return this.parentName;
      },
    },
    parentName: {
      value: "Animal",
    },
  }
);

let animal1 = new Animal("animal1");

// 调用实例方法
animal1.getName();
// 调用静态方法
Animal.getParentName();

在创建对象实例时 let animal1 = new Animal('animal1'),主要会经历几个步骤

// 1.新建空对象
let newObj = new Object();
// 2.指向构造函数的原型对象,共享实例方法
newObj.__proto__ = Animal.prototype;
// 3.以新对象为上下文执行构造函数
let result = Animal.call(newObj, "animal1");
// 4.返回一个新对象
// 如果构造函数返回一个对象或函数,对象实例就是该对象或函数;否则返回一个新对象
return result instanceof Object ? result : newObj;

继承

下面通过 extends 关键字实现对 Animal 的继承

class Animal {
  constructor(name) {
    // 实例属性赋值,这里面的this会指向实例
    this.name = name;
  }
  static parentName = "Animal"; // 静态属性
  getName() {
    console.log("调用实例方法,获取实例属性", this.name);
    return this.name;
  }
}

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

let cat = new Cat("jack");
cat.getName();
console.log(Cat.parentName);
// 可以发现,静态属性和方法也被子类继承了

实现 extends

extends 本质上是基于寄生式组合继承来实现的

  1. new 一个实例时,调用父类构造函数,继承实例属性
  2. 通过原型链继承父类实例方法
  3. 设置子类的 proto = 父类,让子类可以调用父类静态属性和方法
// 已知 Animal 这个父类
function _inherits(child, parent) {
  let proto = Object.create(parent.prototype);
  proto.constructor = child;
  child.prototype = proto;
}

function Cat(name) {
  // 调用父类的构造函数,继承实例属性
  Animal.call(this, name);
}

// 继承父类实例方法
_inherits(Cat, Animal);
// 设置子类的 __proto__ = 父类,让子类可以调用父类静态属性和方法
Object.setPrototypeOf(Cat, Animal);

let cat = new Cat("jack");
cat.getName();
console.log(Cat.parentName);

其实早期 js 实现继承还有好几种方式,可以参考 从 js 看面向对象

从JT808/JT1078协议到多端协同:构建高并发北斗车辆监控平台的技术实践 本文详细介绍了基于JT808/JT1078协议构建高并发北斗车辆监控平台的技术实践,包括协议解析、高并发架构设计、多端协同实现及数据持久化策略。通过Netty、Kafka等技术优化,系统成功支撑日均2000万条消息处理,为GPS车辆动态监控系统提供了可靠解决方案。 阅读详情

相关推荐

从零解析特斯拉线圈:谐振变压器的核心原理与DIY实践

本文深入解析特斯拉线圈的工作原理与DIY实践,从LC振荡电路到电磁耦合,详细介绍了谐振变压器的核心原理。通过材料清单、绕制技巧和安全指南,帮助爱好者从零开始打造迷你闪电发生器,体验高压电子实验的独特魅力。

weixin_33670786的博客 493

js中class类的基本使用

class类的基本使用

yy869949908的博客 7148

Fusion 360嵌入式外壳建模实战:从草图到可装配结构

参数化三维建模是现代电子结构设计的核心能力,其本质是通过几何约束与特征驱动实现设计意图的精确表达和快速迭代。Fusion 360作为集成CAD/CAM/CAE的云端平台,以时间轴驱动的参数化工作流、基于基准面的草图约束机制和面向制造的特征操作逻辑,显著提升了嵌入式硬件的结构验证效率。该技术价值在于支持工程师在无专业机械背景前提下,独立完成PCB适配、散热布局、接口开孔与装配干涉检查等关键任务,广泛应用于3D打印原型、CNC加工外壳及IoT终端结构开发。本文以ESP32冰箱监控终端为实例,详解从基准定义、草图

weixin_35671843的博客 589

js 修改Class未生效

问题描述: 最近开发遇到了使用js的classList添加类时 未在页面中生效的问题,奇怪的是 使用JS查看dom数据类名是已经添加上的,但是页面上的dom对象并没有反应。部分代码如下: const options = { ...playPDFDefaultConfing, ...o } const domEnd = options.elem.querySelectorAll(".play-item-mask")[0]; const domIframe = options.elem.

qq_36079511的博客 3184

ROS学习【11】-----基于ubuntu16.04上Gazebo机器人环境搭建的传感器仿真(camera、kinect、Lidar),并通过Rviz进行数据显示

ROS学习-----基于ubuntu16.04上Gazebo机器人环境搭建的传感器仿真目录一、Gazebo环境搭建前的准备1、将搭建模型下载到我们的gazebo环境下2、升级我们的gazebo版本二、创建配置launch文件参数的world文件1、进入工程包mbot_gazebo2、创建文件夹worlds3、进入该文件夹4、创建playground.world文件5、创建room.world文件三...

qq_42451251的博客 3611

pta——特立独行的幸福

这是我认为比较复杂的一道题了,比较迷茫的点在于不知道要算各位平方和几次到不了1,才算他不是幸福数。突破口在于如果如果不是回到1也会有一些数字重复出现,只要重复出现的数字不是1,那就不是幸福数

m0_65620244的博客 4036

【BUG】【CSS】【JS】JavaScript动态添加CSS的class类样式不生效,原因是css样式优先级在加载css文件的时候就确定下来的.

css的权重,多个class存在相同参数名不同参数值,优先级是根据css加载的class类名顺序的...

南方者的博客 4463

Python与西门子PLC数据交互实战:基于Snap7的跨平台工业通信指南

本文详细介绍了如何使用Python和Snap7库实现与西门子PLC的数据交互。内容涵盖跨平台环境搭建、连接参数配置、数据读写实战及性能优化技巧,为工业自动化、数据采集和智能制造场景提供了一套轻量、灵活且高效的通信解决方案。

vim8coder的博客 287

js动态添加的新节点class不生效,点击事件无效

原因:dom未重新加载, $(".close,.cs").click(function() { $(".modal").hide(); }); 改为 $(document).on("click", ".huanshu", function () { var sds = $(this).prev().prev().prev().p...

weixin_42573146的博客 6550

Intel AX系列网卡5G热点开启失败?Linux下3种修复方案实测(含Ubuntu/OpenWRT)

本文针对Intel AX系列网卡在Linux系统下无法开启5G热点的常见问题,深入剖析了其根源在于内核LAR机制与驱动的兼容性。文章提供了三种实测有效的修复方案:针对内核低于5.5的模块参数法、适用于高内核版本的hostapd补丁编译法以及高阶的驱动修改法,帮助用户在Ubuntu、OpenWRT等环境中成功启用5G热点功能。

weixin_29291863的博客 735

量化策略分享之ST股弱转强,回测年化123%

本策略的核心是精选ST股票,国九条过滤,防止直接暴雷退市,只做ST股票的弱转强,弱转强的认定标准是前日涨停但昨日不涨停,昨日收盘价大于前一日最低价,昨日收盘价大于10日线,昨日成交量大于前一日的成交量但小于前一日成交量的10倍,股价大于1;这类股票强势,有资金介入,能获得超额收益。

qq_29301281的博客 1268

JavaScript深入之Class构造及继承的底层实现原理

在 JavaScript 中,class 语法是 ES6(ECMAScript 2015)引入的,用于创建对象的模板和实现继承。尽管 class 语法提供了一种更接近其他面向对象编程语言(如 Java 和 C++)的方式来定义类和继承,但它的底层实现原理仍然基于 JavaScript 的原型链机制。下面是对 class 构造和继承底层实现原理的详细解释。

呼叫6945的博客 893

通信原理 | python调制识别数据及代码

数据集包含了从-20dB 到+18dB 总共 20 个信噪比(步长为 2)下的 11 种调制信号, 包括 AM-DSB、 AM-SSB 和 WBFM 三种模拟调制信号,以及 BPSK、 QPSK、 8PSK、 CPFSK、 GFSK、 PAM4、 QAM16 和 QAM64 八种数字调制信号。其中信号的中心频率为 200KHz,采样频率为 1Msamp/s,且每个信噪比下每种调制信号包含 1000 个信号。其中每个信号包含 IQ 两路数据,且每一路数据都包含有 128 个采样点。

若北辰 1758

【一天时间|JavaScript基础】原型和原型链

本期介绍原型、原型链和 class。包括 class ,继承,原型,原型链,instanceof。原型是 “JS 三座大山” 之一,原型和原型链也是必考知识点。

江拥羡橙的博客 2万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

模拟实现JS的new操作符、继承和ES6中class的实现原理

使用 new 操作符调用构造函数实际上会经历以下 4个步骤: (1) 创建一个新对象; (2) 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象) ; (3) 执行构造函数中的代码(为这个新对象添加属性) ; (4) 返回新对象。 function myNew(fn) { let obj = {} obj = Object.create(fn.prototype) let args = Array.prototype.slice.call(arguments, 1

qingbaicai的博客 426

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JavaScript实现继承的几种方式详解(代码可本地运行便于理解)

JavaScript实现继承的几种方式 1.原型链继承 2.利用函数对象call和apply实现继承(call和apply只是传参格式上有区别) 3.混合继承(call、apply和原型继承混合) 4.ES6 Class关键字继承

小猿同学628的博客 312

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

JS基础-原型和原型链

JS基础-原型和原型链如何用class实现继承如何理解JS原型(隐式原型和显示原型) 如何用class实现继承 创建类 class Student{ constructor(name,number){ this.name=name this.number=number } sayHi(){ console.log(`姓名 ${this.name} ,学号 ${this.number} `) } } //通过类 new 声明对象/实例 const x

yolo 662

JavaScript 原型/原型链

回到我们开篇的问题,class 关键字帮我们做了什么?instanceof 关键字又帮我们简化了什么?这两个问题的答案已经十分清晰了,但也不妨在这里做个总结:class 本质是一个语法糖,他帮我们处理绑定每个对象的原型,实现属性的共享。// 无 class 的写法// true// 对应的 class 写法显而易见的,class 的写法更符合我们面向对象的编程习惯,function 的写法则相对不那么直观。

专注前端领域方向的内容 1653

一文搞懂 JavaScript 原型链:从本质到实战应用

JavaScript 原型链是理解 JS 面向对象编程的核心机制。本文从构造函数、原型对象和实例对象的关系入手,解析了原型链的运作原理:通过 __proto__ 属性形成链式查找结构,实现属性和方法的共享继承。文章详细演示了原型链继承的实现方式,包括构造函数调用、原型指向调整和 constructor 修复等关键步骤,并指出原型链继承的潜在问题。最后强调 ES6 的 class 本质仍是基于原型链的语法糖。掌握原型链机制对深入理解 JavaScript 对象模型至关重要。

m0_61594728的博客 871

JavaScript 中 class 原理介绍

这种语法糖不仅提高了代码的可读性和可维护性,还使得 JavaScript 在面向对象编程方面更加得心应手,为开发者提供了更高效、更强大的编程体验。关键字用于调用父类的构造函数或方法,它在子类的构造函数中起着至关重要的作用,确保父类的属性和方法能够正确地被继承和初始化。子类的实例不仅可以访问父类的属性和方法,还可以拥有自己独特的属性和方法,从而实现了代码的复用和扩展。私有属性和方法只能在类的内部访问,外部无法直接访问,这为类的封装提供了更强大的支持。这意味着,当我们创建一个类的实例时,实例的。

奋斗的小前端 578

js原型以及class语法糖实现

在js中,原型,原型链及原型继承的重要性不言而喻,它不像java等语言通过class来继承: // 父类 public class Person{ private String name, private int age, public Person(String name,int age){ this.name = name this.age = age } ...

qq_39246667的博客 1636

js中class是怎么实现的

class的实现 一谈到编程,我们首先想到的就是O(Object)O(Oriented)P(Programming)编程,也就是面向对象编程。面向对象编程是一种设计思想。如果把程序当做一个人,那么对象就是各个器官,对象里面的各种操作函数就是细胞。 很多语言中面向对象的蓝图都是基于类,比如Pytho、C++、Java。js在es6语法中也引入了类的概念,不过还是基于...

weixin_33681778的博客 5075

JavaScript中的继承,ES6中class和extends的原理

我在上一篇博客中介绍了JavaScript中new操作的原理,那么就接下来就来探索下,ES6中引进的class和extends的原理吧。

peifeng_chen的微博 1766

一文搞懂卡片、堆叠式所有轮播图原理-JavaScript实现轮播图

大厂各种花哨轮播图你是措手无策,我的教程你是不屑一顾,相信看完本篇文章,能带你掌握各种花哨的轮播图,先放上之前写好的效果图,代码在文章最后。

q145p152的博客 6115

如何掌握JavaScript原型链:面向对象编程的终极指南

JavaScript作为现代Web开发的基石,其独特的原型链机制是理解面向对象编程的核心。本文将通过简单易懂的方式,带你全面掌握JavaScript原型链的工作原理,让你能够轻松应对日常开发中的原型继承问题。 ### 什么是JavaScript原型链? JavaScript是一种基于原型的编程语言,与传统的基于类的语言不同,它通过原型链实现对象之间的继承关系。每个对象都有一个原型对象,对象可以

gitblog_00103的博客 844
上一篇: javascript-原型和原型链
下一篇: javascript-异步编程
__lucas
博客等级 码龄9年 329粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值