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

构造函数、原型和实例的关系:每个构造函数都有一个原型对象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. $.ajax()方法详解(转)

    转: http://www.cnblogs.com/tylerdonet/p/3520862.html 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: ...

  2. C#使用SQL语句时候的万用密码问题

    实际上万用密码就是因为SQL里面的语句--是注释,利用bug添加用户名和密码. 例如,用户名为 adada’ or 1=1-- 第一个种写法登录成功了 第二种写法登录失败(正确) 第三种写法登录失败( ...

  3. model特性

    1.scope http://blog.csdn.net/lissdy/article/details/51107883 2.ActiveConcern http://www.tuicool.com/ ...

  4. 简介windows的环境变量

    环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,比如临时文件夹位置和系统文件夹位置等.这点有点类似于DOS时期的默认路径,当你运行某些程序时除了在当前文件夹中寻找外,还会到设置的默认路 ...

  5. 【leetcode刷题笔记】Permutation Sequence

    The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  6. python作用域和js作用域的比较

    1.python和js一样,作用域链在执行方法之前就已经创建了 # 下面的执行结果就是aa,原因是这点python和js一样,作用域链已经创建了,不会去改变 xo="aa" def ...

  7. linux 资源管理

    1. 查看内存信息  free [root@rhel6 script]# free total used free shared buffers cached Mem: -/+ buffers/cac ...

  8. Spring Cloud之Eureka自我保护环境搭建

    Eureka详解 服务消费者模式 获取服务 消费者启动的时候,使用服务别名,会发送一个rest请求到服务注册中心获取对应的服务信息,让后会缓存到本地jvm客户端中,同时客户端每隔30秒从服务器上更新一 ...

  9. EntityFramework 学习 一 Entity Relationships 实体的关系

    下面,我们学习Entity Framework怎么管理实体间的关系 Entity Framework支持三种关系:一对一的关系.一对多的关系.多对多的关系 前面我们创建SchoolDB的实体数据模型, ...

  10. sqoop导入增量数据

    使用sqoop导入增量数据. 核心参数 --check-column 用来指定一些列,这些列在增量导入时用来检查这些数据是否作为增量数据进行导入,和关系行数据库中的自增字段及时间戳类似这些被指定的列的 ...