经过多次的翻阅书籍终于对原型链在实际代码中的应用有了新的认识,但是不知道是否有错误的地方,还请大神多多指教。

构造函数、原型和实例的关系:每个构造函数都有一个原型对象funName.prototype,原型对象有一个指向构造函数的内部指针constructor,实例对象包含一个指向原型对象的内部指针__proto__(保证了实例可以访问构造函数原型内部所有的)。

(1)       万物皆对象,函数也是对象。函数(function)是对象,函数的原型(function.prototype)也是对象。它们(函数和对象)具有对象的共同特点。即对象都有_proto_属性(隐式原型),它指向构造函数的原型对象。保证了实例可以访问构造函数原型中所有的方法和属性

(2)       函数(function)除了_proto_属性外,还有prototype属性。这个属性是一个指针,指向一个该构造函数的原型对象,该对象包含所有可以共享的属性和方法。即new Object().__proto__ ===Object.prototype为true。

实例1:原型模式创建对象

代码:

function Person(){};
var p = new Person();
console.log(p.__proto__ == Person.prototype);//true
//实例对象的_proto__指向其构造函数的原型对象。 console.log(Person.prototype.constructor == Person);//true
//原型对象的constructor指向构造函数 console.log(Person.__proto__ == Function.prototype);//true
// 构造函数的__proto__指向其构造函数Function的原型对象,即Function.prototype console.log(Person.prototype.__proto__== Object.prototype);//true
//原型对象的__proto__指向其构造函数Object的原型对象,即Object.prototype

实例2:原型链继承

var Person = function(){};
var Child = function(){};
Child.prototype = new Person();
var pp = new Child();
console.log(pp.__proto__ == Child.prototype); // true
//实例对象的__proto__ 指向构造函数原型对象 console.log(Child.prototype.__proto__ == Person.prototype);//true
// 子构造函数原型对象的__proto__指向父类的原型对象 console.log(pp.__proto__.__proto__ == Person.prototype);//true
// 所以子实例对象的__proto__.__proto__ 指向父原型对象 console.log(Child.__proto__ == Function.prototype);//true
//子构造函数的proto指向Function的原型对象(见第二行代码) console.log(Person.__proto__ == Function.prototype);//true
//父构造函数的__proto__指向Function的原型对象(见第一行代码) console.log(Person.prototype.__proto__ == Object.prototype );//true
//父原型对象的__proto__指向其Object的原型对象 console.log(Person.prototype.constructor == Person );//true
//父原型对象的constructor 指向 父构造函数 console.log(Child.prototype.constructor == Person); // true
//子原型对象的conmstructor指向父构造函数(见第三行代码)

综上所述,只要熟记函数和对象的__proto__属性指向其构造函数原型对象,函数的prototype也指向构造函数的原型对象,原型对象有一个指回构造函数的指针constructor。

javaScript之深度理解原型链的更多相关文章

  1. JavaScript之继承(原型链)

    JavaScript之继承(原型链) 我们知道继承是oo语言中不可缺少的一部分,对于JavaScript也是如此.一般的继承有两种方式:其一,接口继承,只继承方法的签名:其二,实现继承,继承实际的方法 ...

  2. javascript中继承(一)-----原型链继承的个人理解

    [寒暄]好久没有更新博客了,说来话长,因为我下定决心要从一个后台程序员转为Front End,其间走过了一段漫长而艰辛的时光,今天跟大家分享下自己对javascript中原型链继承的理解. 总的说来, ...

  3. javascript 重难点(原型链 this) 理解总有一个过程,不要急,循序渐进!

    开始补充: 1. 将函数定义作为对象的属性,称之为对象方法.2. this的指向是由它所在函数调用的上下文决定的(语境),而不是由它所在函数定义的上下文决定的.3. 因为当一个函数作为函数而不是方法来 ...

  4. JavaScript高级内容:原型链、继承、执行上下文、作用域链、闭包

    了解这些问题,我先一步步来看,先从基础说起,然后引出这些概念. 本文只用实例验证结果,并做简要说明,给大家增加些印象,因为单独一项拿出来都需要大篇幅讲解. 1.值类型 & 引用类型 funct ...

  5. JavaScript 随笔2 面向对象 原型链 继承

    第六章 面向对象的程序设计 1.创建对象的几种方式 A)工厂模式 function CreatObj(name,sex,age){ this.name=name; this.sex=sex; this ...

  6. javascript 创建对象及对象原型链属性介绍

    我们知道javascript里定义一个普通对象的方法,如: let obj = {}; obj.num = 1; obj.string = 'string'; obj.func = function( ...

  7. Javascript之继承(原型链方式)

    1.原型链 原型链是JavaScript中继承的主要方法. 每个构造函数都拥有一个原型对象,原型对象都包含一个指向构造函数的指针(constructor),实例都包含一个指向原型对象的内部指针(__p ...

  8. javascript精髓篇之原型链维护和继承.

    一.两个原型 很多人都知道javascript是原型继承,每个构造函数都有一个prototype成员,通过它就可以把javascript的继承演义的美轮美奂了. 其实啊,光靠这一个属性是无法完成jav ...

  9. javascript 面向对象 new 关键字 原型链 构造函数

    JavaScript面向对象JavaScript 语言使用构造函数(constructor)作为对象的模板.所谓"构造函数",就是专门用来生成实例对象的函数.它就是对象的模板,描述 ...

随机推荐

  1. 查看当前.net版本 cmd

    reg query "HKLM\Software\Microsoft\NET Framework Setup\NDP" /s /v version | findstr /i ver ...

  2. (转)Javascript模块化编程(一):模块的写法

    随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂. 网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者 ...

  3. mysql复制表结构和内容

    许多时候我们想复制一张表部分或者全部内容,或者只复制一张表的框架,这种需求应该说我们很常见. 其实想要实现这种需求十分简单. 表一: mysql> select * from student_i ...

  4. 如何让Jackson JSON生成的数据包含的中文以unicode方式编码

    我们都知道,Jackson JSON以高速.方便和灵活著称.之前的文章中介绍过使用注解的形式来规定如何将一个对象序列化成JSON的方法,以及如何将一个JSON数据反序列化到一个对象上.但是美中不足的一 ...

  5. java获取调用此方法的上面的方法名、类

    StackTraceElement[] stacks = (new Throwable()).getStackTrace(); for (StackTraceElement stack : stack ...

  6. 【四】MongoDB索引管理

    一.索引介绍 在mongodb中,索引用来支持高效查询.如果没有索引,mongodb必须在整个集合中扫描每个文档来查找匹配的文档.但是如果建立合适的索引,mongodb就可以通过索引来限制检查的文档数 ...

  7. Vim 的命令模式转插入模式

    一.在命令模式输入下面的快捷方式: i 在当前光标前插入字符: I 在当前行行首插入字符: a 在当前光标后插入字符: A 在当前行行尾插入字符: o 在当前行下面另起一新行: O 在当前行上面另起一 ...

  8. Can I run a local BLAST search again multiple blast databases simultaneously?

    from: https://secure.clcbio.com/helpspot/index.php?pg=kb.page&id=113 Can I run a local BLAST sea ...

  9. Blog迁移至Jekyll

    后续的Blog都将在 http://zhwbqd.github.io/ 为您呈现

  10. IntelliJ IDEA Sringboot 项目部署到外部Tomcat服务器

    <packaging>war</packaging> 添加依赖 <dependency> <groupId>org.springframework.bo ...