前端 js 之 面向对象(原型、原型链及继承) 06

news2024/11/15 12:11:26

今天又是一个美好的一天耶 ! ✌

文章目录

  • 一、面向对象编程之前
  • 二、原型 与 原型链 🎁
  • 三、new 的原理 🤞
  • 四、面向对象的优势
  • 五、继承 (构造函数之间的)
      • `ps:`


一、面向对象编程之前


    在面向对象编程之前,我们是 面向二进制编程 (机器语言, 只有 0和1,难);后来 面向指令编程 (汇编语言),是提前将实现某些常用功能的二进制进行封装成指令;再后来就是 面向自然语言编程 (高级语言)

  • 面向过程编程:没有任何封装,纯自然语言,走一步看一步
  • 面向函数编程:可能将重复的使用的代码封装成函数,方便调用
  • 面向对象编程:将多个函数或变量再次进行封装,更大限度的复用,因为对象存放键值对,所以他提升了 查找速度数据传输速度

面向对象设计 OOD

  • 我们在做功能时尽可能将需求拆分成能直接实现的小需求:高内聚,低耦合
  1. 高内聚:一个需求的所有功能和属性必须从属于一个主体(所有的功能和数据,尽可能从属于一个对象)
  2. 低耦合:减低功能之间的关系,每个功能可以独立使用或随时被替换 (功能尽可能拆分,依赖关系降到最低)

创建对象

  1. 单例创建( 字面量方式 ) :如果要得到 一个 对象,每次都需要重新创建
            let obj={ }
            let obj2={ }
  2. 工厂模式创建 ( 构造函数 ):如果得到 一批 同特征 的对象,可以使用(其实就是构造自定义函数)
            定义一个函数,通过new,obj 继承fn属性和方法
            let obj = New fn()

 	  // 单例模式 造手机
      let obj1 = {
        name: "iphone",
        color: "red",
        show: function() {
          console.log("打电话");
        }
      };
      let obj2 = {
        name: "iphone",
        color: "black",
        show: function() {
          console.log("打电话");
        }
      };
      
      // 工厂式 造手机
      function Fn(name, color) {
        this.name = name;
        this.color = color;
        this.show = function() {
          console.log("打电话");
        };
      }
      let obj3 = new Fn("iphone", "black");
      let obj4 = new Fn("iphone", "red");
      

面向对象的好处: 封装 和 继承 多态


二、原型 与 原型链 🎁


    问好兄弟一个问题,如果王思聪去你家吃饭,没带钱,你会让他赊账吗?那肯定是会的呀,毕竟人家老爸是王健林,丝毫不担心他还不上,而且说不定王总一开心,零钱都不用找了…,为什么王建林会让王思聪继承,而不是你呢?那是因为 血缘关系 ,别杠,杠就是你对

  • 我们有一个函数 Fn , prototype 是函数上一个原型属性,他就像这个血缘关系的凭证
  • 比如我们通过 new 的方式得到 obj3 ,当我们访问他的 name 属性时,现在自身找,如果找到就使用
  • 如果我们找他的 name2 这个属性时,发现本身并不存在,就会在这个 fn 函数的 prtotype上找,找到了就使用
     // 构造函数式创建
	 function Fn(name, color) {
        this.name = name;
        this.color = color;
        this.show = function() {
          console.log("打电话");
        };
      }
      Fn.prototype.name2 = "iphone";        
      Fn.prototype.show2 = function() {   
        console.log("拍照");
      };
      
      let obj3 = new Fn("black") 
      // obj3 的值为:
      // obj3={
	  //	name:'black'	
	  //  }
	  // obj3.show = function() {
      //      console.log("打电话");
      //  };
      

先说几个概念

  • 原型:指原来的类型或模型 ( 百度过来的 ,嘿嘿 ) ,比如 Fn 就是 obj3 的原型
  • 原型属性:除了箭头函数,所有函数都会有一个属性prototype,存放实例的公共属性或方法,比如 Fn 的公共属性 name2 和 公共方法 show2
  • 原型链:所有对象类型的数据,都会有一个属性proto,他是一个指针,当想要查找这个对象的某个属性时,会先在只身找,找到了就使用,找不到就会在prototype原型上继续查找,直到顶层对象object,这种沿着原型一层层像链条的方式称为原型链

function Fn(){
}
console.log(Fn.prototype)
// Fn 是一个函数,每个函数都有一个 prototype 属性,用来存放公共属性和公共方法

const obj3 = new Fn()
console.log(obj3.proto)
.
obj3 是new出来的对象 ,每个对象都有一个原型链属性_ proto ,指向当前的函数的 prototype
obj3.
proto _ == Fn.prototype
proto 是个指针嗷!!


     // 王健林
     function  Fn(name){
        this.name=name
     }
      Fn.prototype.money=100
      Fn.prototype.car='法拉利'

      // 王思聪
      const wsc = new Fn()
      console.log(wsc.money)  // 100
      console.log(wsc.__proto__) //Fn.prototyp
      
      console.log(wsc.__proto__ == Fn.prototype) // true
      
      //   王思聪出门忘记带钱包了,但是售货员毫不犹豫让他赊账,为什么?因为他的父亲是王健林
      //   王思聪本身是没钱的,但是他的父亲有 money ,他就可以直接使用
      //   wsc.proto 指向 Fn.prototype
      //   换句话来说,现在自身找,自身没有就找父级(按照原型链找),王思聪继承了王健林所有东西
      

ps : 这也是通过new调用一个函数时,和普通调用函数的区别 !!!

  • 继承 (会沿着原型链查找)
  • 节省内存 (Fn 里的每个函数在创建时会生成对应的函数执行上下文,每次通过构建函数创建出来的对象都会创建一次,当然啦,可以放在原型上,大大节省了内存)
	 function Fn( color) {
        this.color = color;
        this.show = function() {
          console.log("打电话");
        };
         this.show2 = function() {
          console.log("打电话");
        };
         this.show3 = function() {
          console.log("打电话");
        };
      }
      Fn.prototype.show4=function(){
		  console.log('原型继承')
	  }

三、new 的原理 🤞


上面说,使用 new 造轮子,实际上时 js 帮我们封装了,那 new 的原理是什么呢,它干了啥?

  1. 首先它先创建一个新对象
  2. 修改了函数内部的this指向 ,指向这个新对象(浅拷贝)
  3. 将新对象的proto指向当前函数的prototype,并执行
  4. 自动返回这个新对象

    要被new 的函数 ,它的函数名最好要大写,以便区分普通函数

四、面向对象的优势

  1. 封装:将多个相关数据和功能封装成对象之后,可以实现方法或对象本身的复用
  2. 继承:可以重用父类的方法和变量
  3. 多态

五、继承 (构造函数之间的)


一个不具备某个功能的对象,通过某种方式,使用了另一个对象的功能,叫做继承 😂

我们今天要说的就是 构造函数构造函数 之间的 继承


通过更改this指向(构造函数继承)

  • 例子一 :

	function Parent(msg) {
	  this.msg = msg;
	  this.show = function () {
	    console.log(this.msg);
	  };
	}
	Parent.prototype.init = function () {
	  console.log("哈哈哈哈");
	};
	
	function Child(msg) {
	}
	
	const P = new Parent("hello");
	const C = new Child("hi");
	C.show();
	
	// 我发现 P 上面有 msg 属性,而且还有 show 方法,
	//但是 C 没有,但是 C 就想直接使用 P 的 show !
	//这里可以更改 C 的 **this 指向**  (apply bind call 都可)


	function Child(msg) {
	  Parent.call(this, msg);
	}
	const C = new Child("hi");
	C.show();   // c 就可以使用p的构造函数内的方法,
	C.init();   // 但是他不能继承原型上的属性和方法   !!! 这就是继承的特点,

  • 例子二 :

	function SendMsg() {
	  this.s = function () {
	    console.log("发短信");
	  };
	}
	function Game() {
	  this.g = function () {
	    console.log("玩游戏");
	  };
	}
	function Pic() {
	  this.p = function () {
	    console.log("拍照");
	  };
	}
	
	//我现在要生产一个手机,我把手机零件分别给好几家代理商。发现没,第二好处点,多继承!


	function Phone(name) {
	  this.name = name;
	  SendMsg.call(this);
	  Game.call(this);
	  Pic.call(this);
	}
	const P = new Phone("点赞");
	console.log(p);
	

通过改变this指向,继承构造函数内的属性和方法,不能继承原型上的属性和方法,可以实现多继承,简单方便易实现 ✌


修改 原型/原型链 对象


	function Parent(msg) {
	  this.msg = msg;
	  this.show = function () {
	    console.log(this.msg);
	  };
	}
	Parent.prototype.init = function () {
	  console.log("哈哈哈哈");
	};
	const P = new Parent("hello");
	
	//同理我只想继承原型上的方法和属性,我不需要继承构造函数内的方法和属性 ,有办法吗?有!😁😁😁
	
	
	function Child(msg) {}
	const C = new Child("hi");
	C.show();
	

1、修改原型对象继承


	// 简单粗暴,直接赋值
	Parent.prototype = Child.prototype;
	// 但是会有一个很大问题
	// 因为这是一个引入值更改,prototype 是一个对象,进行了浅拷贝,改动child 会影响 parent
	// 这里要注意深浅拷贝
	

注意深浅拷贝 😁


2、修改原型链继承

正常的通过构造函数创建的实例的原型链结构
Parent实例的原型链 ——》 Parent 构造函数的原型对象,的原型链 ——》object 构造函数的原型对象,的原型链
P.proto ——》 Parent.prototype, Parent.prototype.proto ——》 object.prototype


	// 不是直接操作,而是通过建立关系去操作
	Child.prototype = new Parent();
	// child实例的原型链 ——》Parent 的实例,的原型链 ——》
	// Parent 构造函数的原型对象,的原型链 ——》object 构造函数的原型对象,的原型链


混合继承

  1. 构造函数继承 + 原型对象继承
  2. 构造函数继承 + 原型链继承 (不好用,你懂的)
  3. 这个方式就不多说了,结合一下好了啦

es6提供的继承方式

  1. 语法层面上的继承
  2. 但其实就是官方封装了方法
  3. 官方封装了 构造函数+ 原型链继承

	// 定义 class 而不是之前的 function,
	// 注意 属性和方法的写法
	// 通过 extends 继承,可以使用 super 传递给被继承的
	// 这是官方封装好的


	class Parent {
	  constructor(msg) {
	    this.msg = msg;
	  }
	  show() {
	    console.log(this.msg);
	  }
	}
	class Child extends Parent {
	  constructor(m) {
	    super(m);
	  }
	}
	const P = new Parent("hello");
	const C = new Child("hi");
	



ps:

   每种继承方式都有各自的特点! 继承不是完全的复制,如果两个对象所需功能一样,完全没有继承的必要,直接根据一个工厂创建两个对象就 ok 了

请添加图片描述

你学废了吗?😂      谢谢阅读,谢谢点赞并关注(没错我就要道德绑架你!)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1114065.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jmeter(五):json提取器元件及jsonpath介绍,响应断言元件

Jmeter:son提取器元件及jsonpath介绍 json提取器元件介绍 json提取器与正则表达式提取器功能类似,也是用来截取响应信息的部分保 存到指定的变量中去,不同的是,它只能用来处理响应正文,并且响应正文必须 是json格式的…

分享一下微信小程序开发的步骤是什么

随着微信小程序的日益普及和深入人心,许多企业和开发者都开始投身于小程序开发领域。那么,如何从零开始,一步步开发出一个自己的微信小程序呢?下面就让我们一起探讨微信小程序开发的步骤。 一、确定开发目标和定位 在开始开发小程…

Cesium Vue(六)— 材质(Material)

1. 设置entity材质 添加棋盘纹理材质 // 棋盘纹理 let material new Cesium.CheckerboardMaterialProperty({ evenColor: Cesium.Color.RED, oddColor: Cesium.Color.YELLOW, repeat: new Cesium.Cartesian2(2, 2), });添加条纹纹理材质 // 条纹纹理 let material new Cesium…

蓝牙5.4的几个新特性

前述文章《蓝牙5.4引入PAwR,电子价签迎来新机遇》中我们介绍了蓝牙5.4的PAwR特性,该特性的引入使得电子价签领域迎来了新的机遇,但其实蓝牙5.4一共引入了4个特性,本文将逐一进行介绍后面3个特性。 首先来回顾一下蓝牙5.4的几个新…

安装Sentinel

大家好今天来安装Sentinel . 安装Sentinel 下载 : 大家可以选择相应版本(最新版本1.8.6) 官网下载地址 : Release v1.8.6 alibaba/Sentinel GitHub 链接:Sentinel_免费高速下载|百度网盘-分享无限制 (baidu.com) 提取码:8eh9 运行 : 将jar包放到任…

4957B/D/E/F射频/微波综合测试仪

4957B/D/E/F 射频微波综合测试仪 频率范围:30k~40GHz ​4957B/D/E/F射频/微波综合测试仪频率范围可达6.5GHz/18GHz/26.5GHz/40GHz,集双端口矢量网络分析、电缆和天馈线测试、矢量电压测量、频谱分析(通道功率、邻道功率、占用带宽、干扰分…

认识web自动化测试!

1.什么是自动化测试? 自动化测试的概念: 软件自动化测试就是通过测试工具或者其他手段,按照测试人员的预定计划对软件产品进行自动化测试,他是软件测试的一个重要组成部分,能够完成许多手工测试无法完成或者难以实现的测试工作&a…

2023年天猫双十一预售下定金抢红包玩法介绍

2023年天猫双十一预售下定金抢红包玩法介绍 2023年双11预售期间,用户可下定金抢红包。红包可用于抵扣商品货款金额,但有使用规则:红包需在有效期内使用,逾期作废;不同商品可使用的红包有优先级。不同场景下的红包使用要求不同&…

无人机遥控中应用的2.4GHz无线芯片

无人驾驶飞机简称“无人机”,英文缩写为“UAV”,是利用无线电遥控设备和自备的程序控制装置操纵的不载人飞机,或者由车载计算机完全地或间歇地自主地操作。是一种不需要人操控就能够自主飞行的飞行器,它可以执行多种任务&#xff…

亲测好用教师小程序

作为一名老师,经常需要面对的一大挑战就是如何有效地向学生和家长传达重要的学业信息。而其中,成绩的发布与查询更是重中之重。传统的做法是手动录入数据,或者通过电子邮件发送Excel表格,这样做既繁琐又耗时。幸运的是&#xff0c…

ETX很小

windows桌面调节分辨率即可:

Windows Defender防火墙配置错误与GPO:梳理关键点

许多企业在网络中拥有不同的组成部分,包括Windows Defender防火墙、GPO和AD基础设施。网络中的任何部分都可能存在漏洞,这些漏洞可能引发多米诺效应。一旦第一个多米诺出现问题,整个链条都会受到牵连,可能会对您的网络造成无法挽回…

基于LSTM的天气预测 - 时间序列预测 计算机竞赛

0 前言 🔥 优质竞赛项目系列,今天要分享的是 机器学习大数据分析项目 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/po…

数据通信——应用层(超文本)

一,引言 所谓万维网,简单来说就是咱们经常能看见的HTTP,万维网就是基于应用层的HTTP协议出现的。伴随HTTP协议的主要一点就是超文本的概念。 二,超文本的概念 超文本按照非线性结构,将文档中的相关内容的不同部分通过…

新手班主任必备神器

Hello各位亲爱的老师们,你们是否曾经为了查询学生成绩而头痛不已?是否曾经为了家长会前的准备工作而熬夜奋战?今天,我要给大家安利一个超级好用的班级查询系统,让你的工作轻松许多! 那么什么是班级查询系统…

Javascript 函数 笔记/练习

函数 function 又称方法 (method) 自定义函数 是一段预定义好的并且可以反复使用的代码块 定义 <script>function print_name(){document.write("name")} </script>函数调用 直接调用 单独开辟一块内存空间&#xff0c;私有&#xff0c;其中定义的变…

QT读取Excel表格内容到Table Widget

QT读取Excel表格内容到Table Widget_qt导入excel-CSDN博客有一个需求是要把Excel的数据导入到QT的Table Widget表格中。我是一个QT新手&#xff0c;在网上找了很多方法&#xff0c;在这里汇总记录一下。目前总共有四种方法&#xff1a;其中方法适用于不加密的Excel文件&#xf…

大模型LLM相关面试题整理

0 一些基础术语 大模型&#xff1a;一般指1亿以上参数的模型&#xff0c;但是这个标准一直在升级&#xff0c;目前万亿参数以上的模型也有了。大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;是针对语言的大模型。175B、60B、540B等&#xff1a;这些一…

元梦之星内测上线,如何在B站打响声量?

元梦之星是腾讯天美工作室群研发的超开星乐园派对手游&#xff0c;于2023年1月17日通过审批。该游戏风格可爱软萌&#xff0c;带有社交属性&#xff0c;又是一款开黑聚会的手游&#xff0c;备受年轻人关注。 飞瓜数据&#xff08;B站版&#xff09;显示&#xff0c;元梦之星在…

(热门推荐)天津web前端培训班 Web前端学习顺序

互联网行业的热门职业之一的Web前端开发&#xff0c;一直备受大家关注&#xff0c;随着技术的不断进步和互联网的快速发展&#xff0c;2023年对于Web前端来说&#xff0c;前景可谓一片光明。 Web前端发展前景 伴随着人工智能、物联网、5G的发展&#xff0c;各大门户网站、APP…