上篇说过了关于原型链继承的问题,这篇详解一下。

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重点--原型链继承详解的更多相关文章

  1. 最详尽的 JS 原型与原型链终极详解,没有「可能是」。(一)

    最详尽的 JS 原型与原型链终极详解,没有「可能是」.(一) 第二篇已更新,点击进入第三篇已更新,点击进入

  2. 怎么理解js的原型链继承?

    前言 了解java等面向对象语言的童鞋应该知道.面向对象的三大特性就是:封装,继承,多态. 今天,我们就来聊一聊继承.但是,注意,我们现在说的是js的继承. 在js的es6语法出来之前,我们想实现js ...

  3. JS原型与原型链终极详解(转)

    JavaScript原型及原型链详解 一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object,Function 是JS自带的函数对象. ...

  4. 【repost】JS原型与原型链终极详解

    一. 普通对象与函数对象  JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object ,Function 是JS自带的函数对象.下面举例说明 function f ...

  5. JS原型与原型链终极详解

    一. 普通对象与函数对象  JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object ,Function 是JS自带的函数对象.下面举例说明 function f ...

  6. JS 原型链图形详解

    JS原型链 这篇文章是「深入ECMA-262-3」系列的一个概览和摘要.每个部分都包含了对应章节的链接,所以你可以阅读它们以便对其有更深的理解. 对象 ECMAScript做为一个高度抽象的面向对象语 ...

  7. JS原型与原型链终极详解 (转载)

    这篇文章需要认认真真仔仔细细的看才能看懂 一. 普通对象与函数对象  JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object ,Function 是JS自带的函 ...

  8. 最详尽的 JS 原型与原型链终极详解(1)(2)(3)===转载

    转载===方便以后复习 原文网址:https://www.jianshu.com/p/dee9f8b14771 一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为 ...

  9. [转] 最详尽的 JS 原型与原型链终极详解

    四. __proto__ JS 在创建对象(不论是普通对象还是函数对象)的时候,都有一个叫做__proto__ 的内置属性,用于指向创建它的构造函数的原型对象. 对象 person1 有一个 __pr ...

随机推荐

  1. 关于LeetCode上链表题目的一些trick

    最近在刷leetcode上关于链表的一些高频题,在写代码的过程中总结了链表的一些解题技巧和常见题型. 结点的删除 指定链表中的某个结点,将其从链表中删除. 由于在链表中删除某个结点需要找到该结点的前一 ...

  2. SQL SERVER 2012 AlwaysOn - 操作系统层面 01

    搭建 AlwaysOn 是件非常繁琐的工作,需要从两方面考虑,操作系统层面和数据库层面,AlwaysOn 非常依赖于操作系统,域控,群集,节点等概念: DBA 不但要熟悉数据库也要熟悉操作系统的一些概 ...

  3. C# -- 使用Ping检查网络是否正常

    C# -- 使用Ping检查网络是否正常 需引用命名空间: using System.Net.NetworkInformation; 1. 代码实现 try { List<string> ...

  4. 我的第一个python web开发框架(40)——后台日志与异常处理

    后台权限和底层框架的改造终于完成了,小白也终于可以放下紧悬着的心,可以轻松一下了.这不他为了感谢老菜,又找老菜聊了起来. 小白:多谢老大的帮忙,系统终于改造完成了,可以好好放松一下了. 老菜:呵呵,对 ...

  5. 我的第一个python web开发框架(39)——后台接口权限访问控制处理

    前面的菜单.部门.职位与管理员管理功能完成后,接下来要处理的是将它们关联起来,根据职位管理中选定的权限控制菜单显示以及页面数据的访问和操作. 那么要怎么改造呢?我们可以通过用户的操作步骤来一步步进行处 ...

  6. 力扣算法题—093复原IP地址

    给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 示例: 输入: "25525511135" 输出: ["255.255.11.135", ...

  7. python学习——读取染色体长度(四:获取最长染色体的编号)

    # 读取fasta # 解析每条序列的长度 chr_len = {'chr1':10,'chr2':20,'chr3':30,'chr4':40,'chr5':15} # 求和 total_len = ...

  8. java网络编程基本知识

    1.基本概念 网络:一组相互连接的计算机,多台计算机组成,使用物理线路进行连接 网络连接的功能:交换数据.共享资源 网络编程3要素: IP 地址:唯一标识网络上的每一台计算机,两台计算机之间通信的必备 ...

  9. git添加秘钥提示Key is already in use

    种种原因,需要修改git账号的秘钥. 操作如下: 1.删除系统上.ssh下的known_hosts文件  (一般在这个路径下C:\Users\Administrator\.ssh)如果账号不是Admi ...

  10. 【动态规划】 EditDistance

    思路参考: https://www.cnblogs.com/littlepanpc/p/7895810.html 代码参考:https://leetcode.com/problems/edit-dis ...