JS--继承

构造函数、原型、实例、原型链之间的联系

描述:每个构造函数都有一个原型对象;

          每个原型对象都有一个指针,指向构造函数;

          每个实例对象都有一个内部指针,指向原型对象;

   若此时的原型对象是另一个类型的实例,此时的原型对象将包含一个指针,指向另一个原型对象,

   相应的另一个原型对象中也包含一个指针,指向另一个构造函数;若此时另一个原型对象又是另另一个

   类型的实例,那么上述关系依然成立,如此层层递进,就构成了实例与原型的链条,俗称原型链。

   

继承
实现:继承主要通过原型链来实现
基本思想:利用原型让一个引用类型继承另一个引用类型的属性和方法
本质:重写原型对象

继承的实现方式:
1.借用构造函数实现继承
基本思想:在子类中调用父类的构造函数,这样在创建子类实例对象时就会执行父类的构造函数中定义的所有属性的初始化,结果每个子类实例对象都会具有父类属性的一个副本。
function Animal () {
this.name = "animal";
this.colors = ["blue", "green"];
this.sayName = function () {
console.log(this.name);
}
}
Animal.prototype.call = function () {
console.log("Animal call...");
}

function Cat() {
Animal.call(this);
}

var cat1 = new Cat();
var cat2 = new Cat();
cat1.colors.push("black");

console.log(cat1.colors); //"blue", "green", "black"
console.log(cat2.colors); //"blue", "green"
cat1.sayName(); //"animal"
cat1.call(); //cat1.call is not a function.


缺点:方法都在构造函数中定义,函数的复用就无从谈起;
父类原型中的方法对于子类而言是不可见的,结果导致所有属性的继承只能使用构造函数模式。

 

2.借助原型链实现继承

function Animal () {
this.name = "animal";
this.colors = ["blue", "green"];
}

Animal.prototype.call = function () {
console.log("Animal call...");
}

function Cat() {
}

Cat.prototype = new Animal (); //inherit
Cat.prototype.jump = function () {
console.log("cat jump...");
}
var cat1 = new Cat();
var cat2 = new Cat();
cat1.colors.push("black");

console.log(cat1.colors); //"blue", "green", "black"
console.log(cat2.colors); //"blue", "green","black"
cat1.call(); //"Animal call..."
cat1.jump(); //"cat jump..."


缺点:最主要的问题是包含引用类型值的原型,包含引用类型的原型属性会被所有的实例对象共享,这就是为什么要在构造函数而不是原型对象中定义属性的原因;
在通过原型实现继承时,原型会变成另一个类型的实例,于是原先的实例属性就变成了现在的原型属性了。

 

3.构造函数和原型链组合方式实现继承

基本思想:使用构造函数模式实现对实例属性的继承,保证了每个实例对象都有自己的属性;
使用原型链模式实现对原型属性和方法的继承,实现了函数的复用。

function Animal () {
this.name = "animal";
this.colors = ["blue", "green"];
}

Animal.prototype.call = function () {
console.log("Animal call...");
}

function Cat() {
Animal.call(this);
}

Cat.prototype = new Animal (); //inherit

Cat.prototype.jump = function () {
console.log("cat jump...");
}
var cat1 = new Cat();
var cat2 = new Cat();
cat1.colors.push("black");

console.log(cat1.colors); //"blue", "green", "black"
console.log(cat2.colors); //"blue", "green"
console.log(cat1 instanceof Cat, cat1 instanceof Animal); //true true
console.log(cat1.constructor); //Animal

缺点:任何情况下,父类的构造函数执行了两次,不必为了指定子类型的原型而调用父类的构造函数,我们所需要的无非就是父类原型的一个副本而已;
无法区分一个实例对象是子类实例还是父类实例。


4.构造函数和原型链组合方式实现继承优化(1)

function Animal () {
this.name = "animal";
this.colors = ["blue", "green"];
}

Animal.prototype.call = function () {
console.log("Animal call...");
}

function Cat() {
Animal.call(this);
}

Cat.prototype = new Animal (); //inherit

Cat.prototype.jump = function () {
console.log("cat jump...");
}
var cat1 = new Cat();
var cat2 = new Cat();
cat1.colors.push("black");

console.log(cat1.colors); //"blue", "green", "black"
console.log(cat2.colors); //"blue", "green"
console.log(cat1 instanceof Cat, cat1 instanceof Animal); //true true
console.log(cat1.constructor); //Animal

描述:解决了两次调用父类构造函数的问题,但是仍然无法区分一个实例对象是子类实例还是父类实例。


5.构造函数和原型链组合方式实现继承优化(2)

function Animal () {
this.name = "animal";
this.colors = ["blue", "green"];
this.sayName = function () {
console.log(this.name);
}
}

Animal.prototype.call = function () {
console.log("Animal call...");
}

function Cat() {
Animal.call(this);
}

Cat.prototype = Object.create(Animal.prototype); //inherit
Cat.prototype.constructor = Cat;

Cat.prototype.jump = function () {
console.log("cat jump...");
}
var cat1 = new Cat();
var cat2 = new Cat();
cat1.colors.push("black");
console.log(cat1.colors); //"blue", "green", "black"
console.log(cat2.colors); //"blue", "green"

console.log(cat1 instanceof Cat, cat1 instanceof Animal); //true true
console.log(cat1.constructor); // Cat

描述:目前最完美的继承实现方式;
-

继承

实现:继承主要通过原型链来实现

基本思想:利用原型让一个引用类型继承另一个引用类型的属性和方法

本质:重写原型对象

转载于:https://www.cnblogs.com/marton/p/9734732.html

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

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

相关文章

Linux C/C++多线程pthread实例

inux中C/C开发多线程程序多遵循POSIX线程接口(也就是pthread),pthread涉及函数很多个(更多参见pthread.h头文件),常用的有pthread_create、pthread_dispath、pthread_mutex_lock(互斥锁定&#…

python 横向合并_使用Python横向合并excel文件的实例

起因:有一批数据需要每个月进行分析,数据存储在excel中,行标题一致,需要横向合并进行分析。数据示意:具有多个代码:# -*- coding: utf-8 -*-"""Created on Sun Nov 12 11:19:03 2017author:…

javafx游戏_JavaFX游戏(四连环)

javafx游戏这是我的第一个JavaFX游戏教程,也是我关于JavaFX面板的第一篇博客文章。 我仅用200几行代码就完成了这四款连接游戏,足以应付一个简单的游戏。 我在这里使用GridPane面板对磁盘进行布局,GridPane是JavaFX布局窗格之一,但…

Matlab的sort函数

1、Matlab自带排序函数sort用法 [Y,I] sort(X,DIM,MODE) sort函数默认Mode为ascend为升序,sort(X,descend)为降序排列。 sort(X)若X是矩阵,默认对X的各列进行升序排列 sort(X,dim) dim1时等效sort(X)dim2时表示对X中的各行元素升序…

django HttpResponse的用法

一、传json字典 def back_json(rquest):#JsonResponse父类是HttpResponse,原码里调用了json.dumps()from django.http import JsonResponseback_msg {name:name,age:123}return JsonResponse(back_msg) 二、传列表 def back_json(rquest):#JsonResponse父类是HttpR…

gcc/g++ 链接库的编译与链接

程序编译一般需要经预处理、编译、汇编和链接几个步骤。在实际应用中,有些公共代码需要反复使用,就把这些代码编译成为“库”文件。在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为…

Speedment 3.0的新功能

如果您关注我的博客,那么您会知道我已经参与开源项目Speedment已有一段时间了。 在夏季和秋季,我完成了工具包的下一个3.0.0大型发行版的大量工作。 在这篇文章中,我将展示我们已经在平台中内置的一些很酷的新功能,并说明如何入门…

Matlab在坐标点上按顺序标序号

程序一: clear x[1 3 7 10]; y[2 4 9 43]; plot(x,y,r-) hold on for i1:4%用这个循环cnum2str(i);c[ ,c];text(x(i),y(i),c) end axis([0 10 0 50]) 程序二: xrand(10,1)*10; yrand(10,1)*10; %x,y表示任意10个点的坐标 plot(x,y,*); for i1:10text(x(…

python表情符号编码大全_Emoji的编码以及常见问题处理

我在虎嗅上看过一篇关于Emoji的趣闻, 特别有意思, 在这里跟大家分享一下。里面提到了Emoji是怎么诞生的。1999年前后,日本一个名叫栗田穰崇的年轻人,和许多直男一样, 给女友发的短信经常会被误解。比如,“知道了”被解读成“生气了…

机器学习套路三步走

机器学习的套路 1.model如何对现实的场景进行抽象2.model如何对参数进行求解3.model的效果如何评价1.抽象 例如线性回归,就是认为预测变量y和特征X之间存在线性关心,老掉牙的例子就是房价和地区收入,人口密度等等的线性关系 线性回归的数学假…

C及opencv指针释放问题

一个图像处理的项目运行时没有问题,最后关掉显示的图片时提醒触发一个断点,点击继续则出现以下画面:断点停留在释放指针的那一行。究其原因如下: 1.错用free释放IplImage* IplImage* input cvLoadImage("data/LOGO/2_1.jpg&…

gcc/g++基本命令简介

gcc & g现在是gnu中最主要和最流行的c & c编译器 。 g是c的命令,以.cpp为主,对于c语言后缀名一般为.c。这时候命令换做gcc即可。其实是无关紧要的。 其实编译器是根据gcc还是g来确定是按照C标准还是C标准编译链接。 下面以Test.cpp为例&#x…

python返回长度值_Python 文件 truncate() 方法(截断返回截取长度)

概述Python 文件 truncate() 方法用于截断文件并返回截断的字节长度。指定长度的话,就从文件的开头开始截断指定长度,其余内容删除;不指定长度的话,就从文件开头开始截断到当前位置,其余内容删除。语法truncate() 方法…

Opencv中IplImage的四字节对齐问题

一、结构解释IplImage数据结构体中有两个宽度:1 是width属性,表示图像的每行像素数;2 是widthStep属性,表示存储一行像素需要的字节数。在OpenCV里边,widthStep必须是4的倍数,从而实现字节对齐,…

庞佐错觉_水晶球错觉

庞佐错觉我注意到人们有时会避免进行彻底的测试。 对于某些人来说,这听起来像是伪造的,但请听我说…… 测试会产生被困的感觉,每引入一个新的测试,负担就会加重。 建立稳定,无干扰且质量保证的测试套件是一项艰巨的任务…

静态编译和动态编译区别

静态函数库 一般扩展名为(.a),这类的函数库通常扩展名为libxxx.a 。 这类函数库在编译的时候会直接整合到程序中,所以利用静态函数库编译成的文件会比较大,这类函数库最大的优点就是编译成功的可执行文件可以独立运行,…

python怎么爬取电影海报_python爬虫之通过BeautifulSoup获取豆瓣最新上映电影的海报...

0.目录1.分析页面2.初步代码3.完整代码4.总结5.补充1.分析页面上一次我们讲了xpath获取豆瓣最新上映电影的海报,这一次会分析如何使用BeautifulSoup获取。启程:python爬虫之通过xpath获取豆瓣最新上映电影的海报​zhuanlan.zhihu.com首先,进入…

switch使用中遇到的问题

switch分支语句中case判断不会进行隐式数据类型转换; 1 const fn (value) > {2 let str all;3 switch (value) {4 case :5 return all0;6 case 3:7 return all3;8 case 4:9 return all4;…

opencv读取视频并保存为图片

1.功能&#xff1a;opencv读取指定文件夹中的视频文件&#xff0c;按照一定的间隔截取某些帧&#xff0c;将这些帧图像连续命名&#xff0c;存储在指定文件夹里。 2.代码如下&#xff1a; &#xff08;1&#xff09;IplImage #include <stdlib.h> #include <stdio.h&g…

将Jython嵌入到您的Java代码库中

Jython是一个使用相当可靠的语法的快速Java脚本的好工具。 实际上&#xff0c;当使用jmx为您的Java应用程序实现一些维护或监视脚本时&#xff0c;它的运行效果非常好。 如果您与其他具有python背景的团队合作&#xff0c;则将python集成到您的java应用程序是绝对有意义的。 …