js重点--原型链继承详解
上篇说过了关于原型链继承的问题,这篇详解一下。
1.开始:dog的实例属性(type:dog ),dog的原型对象(dog._proto_),
dog._proto_ :dog的原型对象属性(type:animals),animals的原型对象(animals._proto_),
animals._proto:animals的原型对象属性(a:a),object的原型对象(object._proto_),
object._proto:object的方法,null。
function animals(){
this.type = "animals";
}
animals.prototype.a = "a";
function dog(){
this.type = "dog";
}
dog.prototype = new animals();
var d = new dog();
console.log(d);

2.在dog的构造函数中调用了animals,此时dog构造函数中会拷贝animals中的所有构造函数属性,若有相同的属性,则会修改为animals中的属性值。
开始:dog的实例属性(type:animals),dog的原型对象(dog._proto_),
dog._proto_ :dog的原型对象属性(type:animals),animals的原型对象(animals._proto_),
animals._proto:animals的原型对象属性(a:a),object的原型对象(object._proto_),
object._proto:object的方法,null。
function animals(){
this.type = "animals";
}
animals.prototype.a = "a";
function dog(){
this.type = "dog";
animals.call(this);
}
dog.prototype = new animals();
var d = new dog();
console.log(d);

3.animals.call(this,type);此时传入了type参数,则在dog拷贝的实例属性type中值为传入的参数值,"animals",在animals中值仍为undefined。
开始:dog的实例属性(name:dog,type:animals),dog的原型对象(dog._proto_),
dog._proto_ :dog的原型对象属性(type:undefined),animals的原型对象(animals._proto_),
animals._proto:animals的原型对象属性(a:a),object的原型对象(object._proto_),
object._proto:object的方法,null。
function animals(type){
this.type = type;
}
animals.prototype.a = "a";
function dog(type){
this.name = "dog";
animals.call(this,type);
}
dog.prototype = new animals();
var d = new dog("animals");
console.log(d);

4.开始:dog的实例属性(type:dog),dog的原型对象(dog._proto_),
dog._proto_ :dog的原型对象属性(b1:b1),object的原型对象(object._proto_),
object._proto:object的方法,null。
function animals(){
this.type = "animals";
}
animals.prototype.a = "a";
function dog(){
this.type = "dog";
}
dog.prototype.b1 = "b1";
var d = new dog();
console.log(d);

5.使用了原型继承,dog.prototype = new animals();,但此时在dog的原型对象属性中没有了b1:b1,那是因为在定义了dog.prototype.b1 = "b1"之后,又dog.prototype = new animals(),此时改变了dog原型对象指向,所以在它原来原型对象中存在的b1属性不再存在于新定义的dog原型对象中。
开始:dog的实例属性(type:dog),dog的原型对象(dog._proto_),
dog._proto_ :dog的原型对象属性(type:animals),animals的原型对象(animals._proto_),
animals._proto:animals的原型对象属性(a:a),object的原型对象(object._proto_),
object._proto:object的方法,null。
function animals(){
this.type = "animals";
}
animals.prototype.a = "a";
function dog(){
this.type = "dog";
}
dog.prototype.b1 = "b1";
dog.prototype = new animals();
var d = new dog();
console.log(d);

6.在dog.prototype = new animals();之前定义的dog.prototype.b1 = "b1"不在现在的dog原型对象属性中,在dog.prototype = new animals();之后定义的dog.prototype.b2 = "b2"存在于现在的dog原型对象属性中。
开始:dog的实例属性(type:dog),dog的原型对象(dog._proto_),
dog._proto_ :dog的原型对象属性(b2:b2,type:animals),animals的原型对象(animals._proto_),
animals._proto:animals的原型对象属性(a:a),object的原型对象(object._proto_),
object._proto:object的方法,null。
function animals(){
this.type = "animals";
}
animals.prototype.a = "a";
function dog(){
this.type = "dog";
}
dog.prototype.b1 = "b1";
dog.prototype = new animals();
dog.prototype.b2 = "b2";
var d = new dog();
console.log(d);

7.由于均是在dog.prototype = new animals();之后定义的,所以b1:b1,b2:b2均存在于dog的原型对象属性中。
开始:dog的实例属性(type:dog),dog的原型对象(dog._proto_),
dog._proto_ :dog的原型对象属性(b1:b1,b2:b2,type:animals),animals的原型对象(animals._proto_),
animals._proto:animals的原型对象属性(a:a),object的原型对象(object._proto_),
object._proto:object的方法,null。
function animals(){
this.type = "animals";
}
animals.prototype.a = "a";
function dog(){
this.type = "dog";
}
dog.prototype = new animals();
dog.prototype.b2 = "b2";
dog.prototype.b1 = "b1";
var d = new dog();
console.log(d);

8.由于dog.prototype = new animals();改变了dog原型对象指代的构造函数,此时为animals构造函数,增加dog.prototype.constructor = dog;可以将构造函数修改为dog。
开始:dog的实例属性(type:dog),dog的原型对象(dog._proto_),
dog._proto_ :dog的原型对象属性(type:animals),animals的原型对象(animals._proto_),
animals._proto:animals的原型对象属性(a:a),object的原型对象(object._proto_),
object._proto:object的方法,null。
function animals(){
this.type = "animals";
}
animals.prototype.a = "a";
function dog(){
this.type = "dog";
}
dog.prototype = new animals();
dog.prototype.constructor = dog;
var d = new dog();
console.log(d);

js重点--原型链继承详解的更多相关文章
- 最详尽的 JS 原型与原型链终极详解,没有「可能是」。(一)
最详尽的 JS 原型与原型链终极详解,没有「可能是」.(一) 第二篇已更新,点击进入第三篇已更新,点击进入
- 怎么理解js的原型链继承?
前言 了解java等面向对象语言的童鞋应该知道.面向对象的三大特性就是:封装,继承,多态. 今天,我们就来聊一聊继承.但是,注意,我们现在说的是js的继承. 在js的es6语法出来之前,我们想实现js ...
- JS原型与原型链终极详解(转)
JavaScript原型及原型链详解 一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object,Function 是JS自带的函数对象. ...
- 【repost】JS原型与原型链终极详解
一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object ,Function 是JS自带的函数对象.下面举例说明 function f ...
- JS原型与原型链终极详解
一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object ,Function 是JS自带的函数对象.下面举例说明 function f ...
- JS 原型链图形详解
JS原型链 这篇文章是「深入ECMA-262-3」系列的一个概览和摘要.每个部分都包含了对应章节的链接,所以你可以阅读它们以便对其有更深的理解. 对象 ECMAScript做为一个高度抽象的面向对象语 ...
- JS原型与原型链终极详解 (转载)
这篇文章需要认认真真仔仔细细的看才能看懂 一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object ,Function 是JS自带的函 ...
- 最详尽的 JS 原型与原型链终极详解(1)(2)(3)===转载
转载===方便以后复习 原文网址:https://www.jianshu.com/p/dee9f8b14771 一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为 ...
- [转] 最详尽的 JS 原型与原型链终极详解
四. __proto__ JS 在创建对象(不论是普通对象还是函数对象)的时候,都有一个叫做__proto__ 的内置属性,用于指向创建它的构造函数的原型对象. 对象 person1 有一个 __pr ...
随机推荐
- 生鲜配送管理系统_升鲜宝 V2.0 小程序辅助系统工具矩阵系列相关说明
随着微信红利的进一步释放,使用人群的不断增加,小程序从2017年01月第一批开发者出现后,2018年小程序得到快速的提升,小程序开发的相关应用小工具得到了市场的青咪,社会化大分工.协同.共享.协作的思 ...
- VR一体机如何退出FFBM
Fast Factory Boot Mode(FFBM)是一种半开机的模式,它的主要目的是方便工厂测试,提高生产效率.正常情况下终端用户是不会碰到的.但售后的同学最近连续收到几台客户退 ...
- Android 视频通信,低延时解决方案
背景: 由于,项目需要,需要进行视频通信,把a的画面,转给b. 运维部署: APP1:编码摄像头采集的数据,并且发送数据到服务端 APP2:从服务端,拉取数据,并且进行解码显示 服务端:接收APP1提 ...
- rabbitmq之确保消息不丢失
1.背景引入 在使用消息中间件(rabbitmq)时,令开发者最头痛的就是防止消息丢失问题,而消息丢失可能发生的位置主要为三种,分别为(1)消息发送到MQ中消费者消费未成功时突然宕机:(2)消息发送到 ...
- Linux如何查找文件的创建时间
Linux的文件能否找到文件的创建时间取决于文件系统类型,在ext4之前的早期文件系统中(ext.ext2.ext3),文件的元数据不会记录文件的创建时间,它只会记录访问时间.修改时间.更改时间(状态 ...
- Python迭代器详解
最近在看两个github项目的代码时对迭代器有些困惑,因此写一篇笔记以理清脉络,经过两天的修改完善对迭代器有了一个初步的理解,相信会比网上绝大多数笔记有用些. 一.基础概念 在进行具体的迭代类和迭代函 ...
- JQuery 图片轮播,详细注释说明,让你一看就会!
准备工作: 1.准备几张大小相同的图片 完成功能: 1.自动轮播 2.手动轮播 3.点击二侧按钮前后切换图片 JQuery插件地址: 链接:https://pan.baidu.com/s/1zNl2- ...
- 【记录】使用在线KMS激活win10系统
摘要 网上一些激活工具可能捆绑了木马.病毒.使用激活工具有风险.使用在线KMS来激活系统则没有这个风险.(自测至发布日期仍然可用) (有能力的请支持正版windows系统) 将kms服务器地址设置为k ...
- WinForm -- 为TextBox文本框添加鼠标右键菜单
WinForm -- 为TextBox文本框添加鼠标右键菜单 1. 新建一个WinForm项目,放置一个TextBox控件 2. 从工具箱拖进来一个ContextMenuStrip 3. 将TextB ...
- 添加python虚拟环境
在我centos上装有两个python版本 # 我在~/py3/目录下创建虚拟环境,该目录为python3的一个独立环境 [root@localhost /]# cd home [root@local ...