原型继承+原型链 + 对象继承发展

一、原型继承:

  1、说起原型继承,就要先由构造函数创造对象说起,首先了解构造函数内部基本原理:

      (1).在函数体最前面隐式的加上this = {}

      (2).执行 this.xxx = xxx;

      (3).隐式的返回this

    并且要注意隐士创建的this对象中有个名为__proto__的属性,其属性值为该构造函数继承的原型prototype。

    而原型对象的有一个名为constructor的属性,其属性值为继承之的构造函数,

    所以可以通过这两个属性相互查看

  2.原型的定义及一些特点:

    a.定义:原型是function对象的一个属性,它定义了构造函数制造出的对象的公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法。原型也是对象。

    b.利用原型特点和概念,可以提取共有属性。

 

    c.对象如何查看原型 — > 隐式属性 __proto__

 

    d.对象如何查看对象的构造函数 — > constructor

  3、若一个构造函数没有指定其原型,则其原型默认为Object.prototype

二、原型链:

  1.原型的形成,最好的解释就是代码了,看如下代码即可

  

A.protorype = {name: 'a'}function A() (this.name = 'A';)B.prototype = new A();function B() {this.name = 'B';}C.prototype = new B();function C(){this.name = 'C';}C继承B,B继承A,形成C->B->A的一条以原型为继承方式的原型链

 

 

  2、原型链上属性的增删改查:

    (1)查:优先去实例对象上寻找是否有该属性,若没有,则再去其对应的原型上去寻找该属性,若都没有,则返回undefined

    (2)增:直接给实例对象增添属性,则仅仅在实例对象上增添属性,若在原型上增添属性,则在原型上增添属属性,则在原型上增添属性,其实例继承原型增添的属性。

    (3)删:delete仅仅能删除实例对象的属性,即构造函数原有的自己的属性和后来实例对象增添的属性,还有关于delete的一点需注意,delete无法删除原型的属性和用var定义的变量(即非window的属性)

      (4)改:更改实例对象的属性,则仅仅更改实例对象的属性值;更改原型的属性值,则更改原型的属性值,继承该原型的对象对应属性值也会被更改;

三、对象继承的发展:

  1、传统模式:即正常的通过构造函数创建实例对象,来继承原型

    缺点:继承了过多不必要的属性

  2、借用其他构造函数(即通过call / apply来改变构造函数内this对象的引用)

    缺点:无法继承借用构造函数的原型

    

  A.prototype = {name: 'a',age: 18,class: 1}function A(){this.name = 'A';}function B(){A.call(this);}var b = new B();console.log(b.name); // Aconsole.log(b.age) // undefined

 

  3、共享原型:即将其他构造函数的原型直接赋值给本构造函数的原型

    缺点:两个原型会想回影响,更改其中一个原型,更一个对应的原型也会被更改。

  

  A.prototype = {name: 'a',age: 18,class: 1}function A(){this.name = 'A';}B.prototype = A.prototype;function B(){this.name = 'B';}
  C.prototype = A.prototype;
  function C() {
    this.name = "C";
  }
var a = new A();var b = new B();
var c = new C();console.log(a.age);
// 18console.log(b.age); //18
console.log(c.age); //18

// 原型继承成功B.prototype.age = 20; //更改其中一个原型的age属性console.log(b.age);//20console.log(c.age); //20// 继承A原型的B和C相互影响

 

  4、圣杯模式:

     每次继承的都是新创建的F构造函数实例,相互之间不会影响。其实此处针对F形成了闭包,Child引用了F,导致F不会销毁。

    (1)正常函数形式:

    

  function inherit (Child, Parent) {// 借用F这个中间量来继承,而不是直接共享原型var F = function (){}F.prototype = Parent.prototype;Child.prototype = new F();// 自定义构造函数原型时,同时要更正自定义原型的constructor,否则一般默认为Object(),次函数若不指定constructor,则constructor为ParentChild.prototype.constructor = Child; Child.prototype.uber = Parent; //记录真正继承的是谁}

 

    (2)闭包形式:

    

    var inherit = (function(){var F = function (){};return function (Child, Parent) {F.prototype = Parent.prototype;Child.prototype = new F();Child.prototype.constructor = Child;Child.prototype.uber = Parent;}})();

 

转载于:https://www.cnblogs.com/Walker-lyl/p/5592048.html

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

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

相关文章

Kotlin之?和!!最简单的理解

一、? 1&#xff09;、?在声明对象时&#xff0c;把它跟在类名后面&#xff0c;表示这个类允许为null var list: ArrayList<String>? null 2&#xff09;、调用对象时&#xff0c;把它跟在对象后面&#xff0c;表示如果为null程序就会视而不见&#xff0c;比如我们…

WPF|一个比较简单带点设计的登录界面

阅读目录效果展示准备简单说明 源码结尾&#xff08;视频及源码仓库&#xff09;1. 效果展示欣赏效果&#xff1a;2. 准备创建一个WPF工程&#xff0c;比如站长使用 .NET 7[1] 创建名为 Login5 的WPF项目。找一张图片做为装饰&#xff0c;放登录表单左侧&#xff1a;添加Nuget…

Android插件基础之类加载器学习

记录学习java 加载器学习所获心得&#xff0c;逐步记录了解java加载器的过程。为了知悉android 插件化的实现原理&#xff0c;从而需要从头了解android加载apk&#xff0c;以及基础的java类加载的加载过程情况&#xff0c;为方便记录和记忆&#xff0c;故此将学习了解的过程记录…

php多个文件上传代码,PHP单文件上传类或多文件上传类源码

以下为引用的内容&#xff1a;php文件:代码://如果收到表单传来的参数&#xff0c;则进行上传处理&#xff0c;否则显示表单if(isset($_FILES[uploadinput])){//建目录函数&#xff0c;其中参数$directoryName最后没有"/"&#xff0c;//要是有的话&#xff0c;以/打散…

《看聊天记录都学不会C语言?太菜了吧》(13)(9*9 乘法表)寻找电脑中的盲盒彩蛋

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖…

Fragment使用--文章集锦

android使用Fragment实现底部菜单使用show()和hide()来切换以保持Fragment状态Android Fragment 真正的完全解析&#xff08;上&#xff09;Android Fragment实践(一)纠正对Fragment Transaction BackStack的误解多个Fragment 切换时不重新实例化Fragment详解之四——管理Fragm…

Android之在在EditText的xml里面配置了相关属性依然没有显示光标问题

1 问题 在EditText的xml里面配置了 android:cursorVisible"true" android:focusable"true" android:focusableInTouchMode"true" 依然没有光标显示 2 解决办法 直接在代码层控制&#xff0c;平且拉起键盘 fun showSoftInputFromWindow(activ…

【经典回放】多种语言系列数据结构线性表之二:链表

目录 1 链表结构设计 2 简单的链表测试 2 链表的组织和ADT设计 3 初始化有头结点链表 4 有头结点链表中追加一个结点(一行数据)

使用 Postman 实现 API 自动化测试

1背景介绍 相信大部分开发人员和测试人员对 postman 都十分熟悉&#xff0c;对于开发人员和测试人员而言&#xff0c;使用 postman 来编写和保存测试用例会是一种比较方便和熟悉的方式。但 postman 本身是一个图形化软件&#xff0c;相对较难或较麻烦&#xff08;如使用 …

php json -gt;访问,【转】Php+ajax+jsonp解决ajax跨域问题

首先&#xff1a;jsonp是json用来跨域的一个东西。原理是通过script标签的跨域特性来绕过同源策略。发送端&#xff1a;$.ajax({type : "post",url : "ajax.php",dataType : "jsonp",jsonp: "callback",//传递给请求处理程序或页面的&…

《看聊天记录都学不会Python到游戏实战?太菜了吧》(1)加载Python神器!亮剑!

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

little tricks(持续更新)【python】

python中的list有reverse方法&#xff0c;但是字符串却没有&#xff0c;怎么办呢&#xff1f; csdn博主有列了几个方法&#xff0c;我觉得第一个最简单直接&#xff0c;str[::-1]搞定。 当然也有一种怪异的方法&#xff0c;我把字符串转为序列reverse一下&#xff0c;再转回来不…

Codeigniter 3 拓展HMVC

2019独角兽企业重金招聘Python工程师标准>>> 在Codeiniter&#xff08;以下统称CI&#xff09; 2.X版本中&#xff0c;我们就通过拓展核心类库实现了HMVC&#xff0c;但是同样的代码&#xff0c;拿到CI 3中&#xff0c;就很有可能不好用了。 ###拓展核心类库方式 官…

FPGA FIFO深度计算

转自&#xff1a;http://comm.chinaaet.com/adi/blogdetail/37555.html 首先&#xff0c;一定要理解清楚FIFO的应用场景&#xff0c;这个会直接关系到FIFO深度的计算&#xff0c;如果是面试官抛出的问题&#xff0c;那么有不清楚的地方&#xff0c;就应该进行询问。如果是笔试或…

玩转ASP.NET Core 6.0框架-序言

ASP.NET Core是微软提供的强大的web框架&#xff0c;它有很多潜在的强大而有用的功能。本专栏的目标是帮助您把框架的隐藏能力最大限度地发挥出来&#xff0c;让您能够按需定制ASP NET Core框架。本专栏提供了一种具体的操作和实现方法&#xff0c;可以让你在短时间尽可能地提高…

从C#开始的面向对象编程经典自学教程

1、C语言的时代 在C语言时代,可以认为那时的编程过程就是表格加工过程,也就是从A表格到B表格、再到C表格…..等等,这个过程中,计算机语言如何描述一个表格,成为计算机语言的关键。 对一个表格的分析可以发现:表格是两部分组成:表头和表格: 学生表 STUDENT 在这个表格…

Java之对List里面的对象名字进行模糊查询

1 问题 对list里面的对象名字进行模糊查询 2 解决办法 //即可以进行模糊匹配matcher.find()//匹配查询matcher.matches() /*** 模糊查询*/public static ArrayList<SearchBean> search(String name, List<SearchBean> list) {ArrayList<SearchBean> results…

《看聊天记录都学不会Python到游戏实战?太菜了吧》(2)在python中加号竟然如此善变

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

mysql数据库rp集群,使用MySQL-Cluster搭建MySQL数据库集群

1、MySQL集群的作用&#xff1a;- 解决访问节点的单点故障- 数据存储节点的单点故障- 解决数据存储节点数据备份问题2、集群&#xff1a;使用一组服务器提供相同的服务3、关于MySQL-Cluster&#xff1a;MySQL官方提供的集群版本已集成标准版MySQL程序&#xff0c;可独立安装使用…

桌面虚拟化云技术将支撑数字化医院

桌面虚拟化云技术将支撑数字化医院 2013-12-04 10:32 现今医疗行业已经从医院——患者的二元关系走向从医院——患者——政府监督——医疗保险的多元关系&#xff0c;医疗体系需要更高效的运转&#xff0c;患者需要更好的就医体验&#xff0c;这使得医疗行业信息化建设的重要性…