你不知道的JavaScript----混合对象 ”类“

2023-10-31

目录

类的概念

类理论:

类设计模式:

类的机制:

类的继承:

类的多态

混入

显示混入 使用call绑定this

隐式混入


类的概念

类的设计模式:实例化,继承和(相对)多态 

  • 封装:把实现某个功能的代码进行封装处理,后期想实现这个功能 直接调用这个函数即可,低耦合,高内聚
  • 多态:重载:方法名相同,参数类型或者个数不同,这样会认为是多个方法 重写:子类重写父类方法
  • 继承:子类继承父类的方法 ,子类的实例既拥有子类赋予的私有/公有属性方法 也想拥有父类赋予的私有/公有属性方法

类理论:

面向对象编程强调的是数据和操作数据的行为本质上是互相关联的。

类是一个通用的基础,继承是实例化的实例具有类的方法和属性,而实例则是一个独立的个体,有自己独有的东西。多态值的是一个类实际化的多个实例,可以改写这个继承的方法。。

类设计模式:

 类是一种设计模式,有多种高级设计模式建立在面向对象类的基础上:迭代器模式、观察者模式、工厂模式、单例模式等等

  • 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
  • 观察者模式(有时又被称为发布/订阅模式)是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
  • 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。
  • 单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例

js实际上没有类,类是一种设计模式,所以可以使用方法来模拟类。

类的机制:

​ 在面向类的语言中,必须将类实例化才可以对抽象化的类进行操作。

  • 类通过复制操作被实例化为对象形式;
  • 类实例是由一个特殊的类方法共造的,这个方法名通常和类名相同,被称为构造函数;

这里提到是复制而不是引用。用构造函数new一个实例,构造函数返回的是对象,这个对象指向创建的这个实例,每new一个实例,相当于创建一个新对象,每个实例直接是相互独立的,这样就明白是复制而不是引用。

class Person {
    name = '';
    // 构造函数
    constructor(name) {
        this.name = name;
    }
    sayName() {
        console.log(this.name);
    }
}
var person = new Person('Lee');
person.sayName();

类的继承:

​ 我们常说子类继承父类,但是用子类DNA是继承父类DNA会更好理解。类通过继承和方法重写实现多态。

  • 多态并不表示子类和父类有关联,子类得到的只是父类的一份副本。类的继承其实就是复制。

  • 在大多数面向类语言中,可以使用super来在子类中引用父类。

  • 但是JS本身并不提供多重继承。

class Father {
    constructor(surname) {
        this.surname = surname;
    }
    saySurname() {
        console.log(this.surname);
    }
}

class Son extends Father {
    constructor(surname, name) {
        super(surname);
        this.name = name;
    }
    sayFullName() {
        console.log(`${this.name} - ${this.surname}`);
    }
}

var son = new Son('Lee', 'Prosper');

console.log(son.surname); // Lee
console.log(son.name); // Prosper

son.saySurname(); // Lee
son.sayFullName(); // Prosper - Lee

类的多态

多态的字面意思就是多种状态,同一操作作用于不同的对象上,可以产生不同的解释和不同的执行结果

class Animal {
    say() {
        console.log('Hello');
    }
    eat() {
        console.log('动物用嘴吃饭-狼吞虎咽!!!');
    }
}

class Person extends Animal {
    eat() {
        super.eat();
        console.log('人用嘴吃饭-斯文的可以了!!!');
    }
}

var person = new Person();

person.say(); // Hello

person.eat(); // 动物用嘴吃饭-狼吞虎咽!!! 人用嘴吃饭-斯文的可以了!!!

混入

混入模式(无论显式还是隐式)可以用来模拟类的复制行为,但是通常会产生丑陋并且脆 弱的语法,比如显式伪多态(OtherObj.methodName.call(this, …)),这会让代码更加难 懂并且难以维护。

  1. 因为JavaScript中只有单继承,当我想要使用其他类的方法,或者说想要增加新的方法,但是又不能够修改自己这个类,更别说其父类了,这个时候就是只能够使用混入了
  2. 混入的本质,还是继承,通过继承当前这个类,创建一个新类返回去

显示混入 使用call绑定this

混合复制

function mixin(sobj,tobj) {
  for(var key in sobj) {
    if(!(key in tobj)) { //什么都不存在的情况下复制
      tobj[key] = sobj[key];
    }
  }
  return tobj;
}


var vehicle = {
  engines: 1,
  ignition: function() {
    console.log("点火器点着了");
  },
  drive: function() {
    this.ignition();
    console.log('发车啦');
  }
}

var car = mixin(vehicle, {
  wheels: 4,
  drive: function() {
    // vehicle.drive();
    //显示绑定 将vehicle.drive绑定到当前this上 this.ignition 调用的就是vehicle里的ignition方法
    vehicle.drive.call(this);
    console.log('轮子开始走了');
  }
})

var a = mixin(vehicle, {})

// vehicle.drive()
car.drive()
// a.drive()

寄生继承

function Vehicle() {
  this.engines = 1;
}

Vehicle.prototype.ignition = function() {
  console.log('打开引擎');
};
Vehicle.prototype.drive = function() {
  this.ignition();
  console.log('开始走');
};

function Car() {
  var car = new Vehicle(); //实例化一个Vehicle对象
  car.wheels = 4; //加入新的属性
  var vehDrive = car.drive; //维持一个函数drive的引用
  car.drive = function() { //重写drive 
    // vehDrive(); 
    vehDrive.call(this); //绑定到当前this
    console.log(this.wheels + '走起~');
  }
  return car;
}

var  aCar = new Car();
aCar.drive();
aCar.ignition();

隐式混入

在构造函数调用或者方法调用中使用call,把某个对象的某个属性绑定进来

a.say()中的赋值操作都会应用在b上而不是a上 

var a = {
    say: function() {
        this.name  = 'zz';
        this.age = '18'
    }
}

var b = {
   say1:function() {
       a.say.call(this) //隐式混入 
   }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

你不知道的JavaScript----混合对象 ”类“ 的相关文章

  • 使用referrer javascript从google获取查询参数

    是否可以从google搜索中获取查询参数 IE 如果有人用谷歌搜索自行车 网址就会变成 https www google es search q bicycles 如果您随后进入搜索结果并且有人点击您的页面 您将无法看到带有 documen
  • Safari 不触发表单提交

    对于一个项目 我有两个选择表单字段 它们通过 jquery 触发器 提交 发送 这在 Firefox 和 Chrome 中运行良好 但在 Safari 中没有任何反应 这是 HTML 代码
  • Socket.io 如何判断某人何时离开

    我正在使用 socket io 创建一个实时游戏 目前 当有人离开时 什么也不会发生 我想以某种方式通知服务器说谁离开了 有没有办法在用户离开时发出正确的信息 我可以让服务器每 1000 毫秒对每个人执行一次 ping 操作 或者通过其他方
  • 禁用 chrome React DevTools 以进行生产

    我正在尝试使用 gulp 和 envify 对我的 React 应用程序进行浏览器化以设置 NODE ENV 因此 我可以删除反应警告 控制台中的错误报告 甚至我的代码来禁用某些功能 例如react addons perf的要求 而且效果很
  • 当 img.crossOrigin="Anonymous" 时,Chrome MJPEG CORS“响应无效”

    Image from origin http 192 168 1 67 5555 has been blocked from loading by Cross Origin Resource Sharing policy Invalid r
  • Backbone Collection 和 Marionette CompositeView 中未定义的模型原型

    尝试从值列表填充集合时 我收到有关集合的错误model s prototype未定义 看着这个问题是关于类似问题的 https stackoverflow com q 16126195 1663942 我已经检查过模型确实已创建before
  • 图表js不显示

    我正在尝试使用 Charts js 创建一个简单的折线图 当我运行下面的代码时 没有出现图表 我究竟做错了什么 我正在关注这个教程http www chartjs org docs latest getting started http w
  • 在多个 angular.js 应用程序之间共享单个服务

    我正在构建一个电子商务网站 基于 shopify 并且使用多个小型 angularjs 应用程序来处理诸如快速购物车 愿望清单 过滤产品和其他一些较小项目之类的事情 我最初使用了一个大型应用程序 具有路由和所有内容 但当我没有完整的 RES
  • 如何为多个元素添加Class?

    我正在使用这段 javascript 向多个元素添加一个类 我试图引用多个 div 并向它们添加类 它只适用于第一个 JavaScript
  • 节省页面加载时间的提示[重复]

    这个问题在这里已经有答案了 我的问题 削减那些不必要的 kb 并使页面加载速度更快的最佳方法是什么 全部是什么优化实践 编码实践 在js php中 如果执行可以使您的页面更轻 为什么我问这个 我读了这篇关于 jquery js 与 jque
  • 无法将中间件与 Firebase 和 NuxtJS 3 一起使用

    我正在尝试在示例项目中使用 Firebase 身份验证 身份验证按预期工作 但是一旦我想使用中间件来阻止用户访问管理页面或在已经登录的情况下访问登录页面 这是不可能的 我已经尝试了几个小时 但没有任何效果 这是我的package json
  • 在javascript中通过window.location传递数据

    我试图通过 window location 传递数据 数据在 del id img album 中可用 我想通过 window location 发送多个值 window location save php type deldownload
  • 如何在 Vue.js 2 中使用事件总线通过自定义事件传递数据

    我在用着Vue js 2 5 x 在我的玩具项目中 我实现了一个事件总线 类似于所示的here https alligator io vuejs global event bus 事件总线在 Vue 原型中全局注册为 eventBus 然后
  • javascript 多维类型数组 (Int8Array) 示例

    我尝试使用类型数组而不是数组来减少内存 function createarrayInt8 numrows numcols number var arr new Int8Array numrows for var i 0 i lt numro
  • 脚本标签内的 Razor RenderSection - 如何将脚本从视图插入模板函数

    我正在使用 MVC 3 和 Razor 视图引擎 我想将多个视图中的脚本注入到一个集中定义的视图中 document ready 母版页中的功能 我已经尝试过以下方法 在我的大师看来 然后 section DocumentReady ale
  • Boolean("false") 返回 true..还有其他选择吗?

    我正在使用 jquery 将 true 和 false 字符串写入 data html 属性 但是 当我将 false 写入其中一个属性 然后检查它是否为 false 时 它 会返回 true 我还在网上读到它应该这样做 这真的毫无意义 有
  • js中将div旋转到一定高度

    How to rotate a div to certain height suppose 10px I can rotate a div otherwise around 360 degrees I need the angle by w
  • 通过排列四个给定数字找到最大可能时间 HH:MM

    我最近为了工作晋升而参加了编码测试 这是我真正遇到的任务之一 我想知道什么是最好的方法来做到这一点 我使用了大量的 if 和 if else 这不是最干净的解决方案 但完成了工作 我被问到的问题是 将 4 个数字格式化为 24 小时时间 0
  • 检测未定义的对象属性

    如何检查 JavaScript 中的对象属性是否未定义 检查属性值是否为特殊值的常用方法undefined is if o myProperty undefined alert myProperty value is the special
  • 带有 'as' 属性的通用 React TypeScript 组件(能够渲染任何有效的 dom 节点)

    我在下面的示例中按预期工作 我的问题是 无论如何我可以重写它 这样我就不必传递通用的T和as支柱 理想情况下我想通过asprop 并让组件的 prop 接口使用它 这在 TypeScript 中可能吗 export type Props l

随机推荐

  • 清华大学uCore-操作系统内核实现

    本系列文章是学堂在线清华大学操作系统慕课 课程实验 实现uCore内核的讲义总结及个人攻略 如果有对课程感兴趣的朋友建议看原课程 前置知识 即提前要掌握的知识 C语言和汇编语言 数据结构和算法 计算机组成原理 实验内容 Lab1 uCore
  • Rust 学习笔记之内存管理与生命周期

    内存管理是理解低级语言 和硬件相关的 的基础概念 低级语言没有提供自动内存管理的解决方案 例如内置垃圾回收器 它要求程序员自己在程序中管理内存 理解内存何时何地被创建和释放可以使得程序员构建出一个高效 安全的软件 然而 低级语言的大量错误也
  • 设计模式第八讲:观察者模式和中介者模式详解

    一 观察者模式 1 背景 在现实世界中 许多对象并不是独立存在的 其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变 例如 某种商品的物价上涨时会导致部分商家高兴 而消费者伤心 还有 当我们开车到交叉路口时 遇到红灯会
  • perl中CPAN的安装

    最近一直在学习nagios监控的知识 因为使用SNMP方式进行监测 而nagios的SNMP监测文件是pl结尾的perl脚本 所以需要安装CPAN 下面就安装CPAN的安装记录步骤如下 首先安装perl 可以通过yum方式进行安装 这样减少
  • STM32F0不同代码区跳转时总失败…这些操作你做对了吗?

    STMCU官网更新了一则实战经验文件 文章以STM32F0为例 就芯片内 从BOOT区跳转到APP区 从APP区跳转到新APP区 从APP区跳回BOOT区 的跳转问题做一些交流与介绍 更多信息请前往官网详情页 文章导读 对于STM32用户
  • java 顺序结构循环队列(源代码)

    1 import java util Arrays 2 public class LoopQueue
  • python模拟登入某平台+破解验证码

    概述 python模拟登录平台 遇见验证码识别 用最简单的方法selenium da破解验证码 来自动登录平台 详细 python用selenium xpath模拟登录 破解验证码 先随便找个小说平台用户登陆 书海小说网用户登陆 书海小说网
  • Golang-指针(pointer)

    1 概念 指针 指向内存地址的变量 指针用来存储变量的内存地址 Go 语言定义变量必须声明数据类型 因为不同数据类型的数据占用不同的存储空间 导致内存地址分配大小各不相同 所有指针只能存放同一类型变量的内存地址 指针分为两种 类型指针和切片
  • Android RecyclerView实现吸顶动态效果,详细分析

    文章目录 一 ItemDecoration 二 实现RecyclerView吸顶效果 1 实现一个简单的RecyclerView 2 通过ItemDecoration画分割线 3 画出每个分组的组名 4 实现吸顶效果 完整demo 链接 h
  • Python 数组的长度

    数组 Array 是有序的元素序列 若将有限个类型相同的变量的集合命名 那么这个名称为数组名 组成数组的各个变量称为数组的分量 也称为数组的元素 有时也称为下标变量 用于区分数组的各个元素的数字编号称为下标 数组是在程序设计中 为了处理方便
  • xss-labs-master 第六关到第十关通关

    要想看前面的五关请看xss labs master 第一关到第五关通关 Level 6 进入题目废话不多说 上来就是一个test测试一下会不会变化 可以看到提示信息有输入的内容 昨天我想了一个可以看到JS变化的代码 话不多说直接上
  • Navicat 链接 MongoDB

    安装完毕后修改配置文件 vim etc mongod conf 默认127 0 0 1为只允许本地连接 0 0 0 0为不限制 多个指定服务器用 连接 bind ip 0 0 0 0 启动 mongod 启动命令行 gt systemctl
  • Android关于libs,jniLibs库的基本使用说明及冲突解决

    最近在开发中遇到了一个问题 因为项目需要集成不同的sdk 相对应的也是不同的 so文件 针对libs中 so库的引入会遇到一些问题 比如要集成第三方NDK库 如果是在eclipse中 需要放到libs下对应库的目录 如果是在Android
  • OpenCV人脸识别C++源码分析

    include cv h include highgui h include
  • OSTaskStkInit():任务堆栈结构的初始化

    转载请注明出处 http dreamlcr cublog cn OSTaskStkInit 任务堆栈结构的初始化 OSTaskCreate 和OSTaskCreateExt 通过调用OSTaskStkInit 初始化任务的栈结构 因此 堆栈
  • Something old,something new,something borrowed,something blue

    Something old something new something borrowed something blue 有旧 有新 有借 有蓝 的婚礼习俗已经有好几百年的历史了 许多新娘在她们举行婚礼的当天都曾被问到是否已经备好了那些
  • 区块链落地的必需工具——预言机(Oracle)

    在 经济学人 杂志中对区块链的定义 区块链是信任的机器 区块链最大的核心创新在于去中心化的解决信任问题 不需要再去信任和依靠第三方机构的情况下进行价值转移 其中 智能合约起到了重要的作用 它是一套数字形式定义的合约 帮助合约参与方执行完成任
  • kali linux 安装python 3xx 以及多版本切换的方式

    简介 在渗透测试的时候 我们通常会用到不同的工具 这些工具可能对python的版本要求不一样 这个时候我们可能就需要在kali上面安装不同版本的python 以及灵活的切换python的版本 下载python3并安装 以python38来举
  • flutter 沉浸式状态栏

    padding new EdgeInsets all 0 0 加上这句就可以 具体原因不知 希望大佬解答
  • 你不知道的JavaScript----混合对象 ”类“

    目录 类的概念 类理论 类设计模式 类的机制 类的继承 类的多态 混入 显示混入 使用call绑定this 隐式混入 类的概念 类的设计模式 实例化 继承和 相对 多态 封装 把实现某个功能的代码进行封装处理 后期想实现这个功能 直接调用这