var A = function(){};
var a = new A();
console.log(a.__proto__); //A {}(即构造器function A 的原型对象)
console.log(a.__proto__.__proto__); //Object {}(即构造器function Object 的原型对象)
console.log(a.__proto__.__proto__.__proto__); //null

实例:

//构造方法,类,函数function Foo(name){this.name = name;}var f = new Foo("wang");//在Foo方法中添加属性Foo.prototype.sex = "女";Foo.prototype.show = function(){console.log("name="+this.name+";sex="+this.sex);}var f2 = new Foo("lacy");console.log(f.sex == f2.sex);f.show();f2.show();

结果:

当查找一个对象的属性时,JavaScript会向上遍历源型链,到查找到达源型链的顶部(Object.prototype),直到找到给定名称的属性为止,如果还是没有找到就会返回undefined。

实例:

function Person(name, age){ this.name = name; this.age = age; }
Person.prototype.MaxNumber = 666;
Person.__proto__.MinNumber = -666;
var will = new Person("Will", 28);
console.log(will.MaxNumber); // 666
console.log(will.MinNumber); // undefined

结果:

在这个例子中分别给”Person.prototype “和” Person.proto”这两个原型对象添加了”MaxNumber “和”MinNumber”属性

“Person.prototype “对应的就是Person构造出来所有实例的原型,也就是说”Person.prototype “属于这些实例原型链的一部分,所以当这些实例进行属性查找时候,就会引用到”Person.prototype “中的属性。

当一个函数被用作构造函数来创建实例时,该函数的prototype属性值将被作为原型赋值给所有对象实例(也就是设置实例的__proto__属性)

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title></head><body><script type="text/javascript">//构造器,函数,对象function Cat(nickname, color) {//各个对象独有的this.nickname = nickname;this.color = color;}//所有对象公有的
            Cat.prototype.life = 9;Cat.prototype.bark = function() {console.log(this.nickname, this.color, this.life, "喵喵...");}var c1 = new Cat("波斯", "绿色");c1.bark();var c2 = new Cat("加菲", "红色");c2.bark();</script></body></html>

控制台结果:

关系图:

(1)、所有函数/构造器都拥有prototype属性,用于指向源型对象

(2)、所有的函数对象即是构造器又是对象。

(3)、所有对象都拥有__proto__非标准属性。

(4)、所有函数(构造器)的__proto__都指向Function.prototype对象。

(5)、所有对象的__proto__指向它的构造器的prototype对象。

(6)、所有函数都是由Function构造出来的,Function自己构造了自己,Object是由Function构造出来的,Function是构造器。

(7)、所有对象的最终原型对象都指向了Object的prototype属性,Object的prototype对象的__proto__属性指向NULL。

(8)、所有prototype原型对象中的constructor属性都指向其构造器。

(9)、原型对象prototype中的成员是所有对象共有的。

(10)、对象在查找成员时先找本对象自己的所有成员,再查找构造器的原型中的成员(向上再查找父类的成员,多步),最终查询Object的成员。

JavaScript是一种通过原型实现继承的语言与别的高级语言是有区别的,像java,C#是通过类型决定继承关系的,JavaScript是的动态的弱类型语言,总之可以认为JavaScript中所有都是对象,在JavaScript中,原型也是一个对象,通过原型可以实现对象的属性继承JavaScript的对象中都包含了一个" prototype"内部属性,这个属性所对应的就是该对象的原型。

"prototype"作为对象的内部属性,是不能被直接访问的。所以为了方便查看一个对象的原型,Firefox和Chrome内核的JavaScript引擎中提供了"__proto__"这个非标准的访问器(ECMA新标准中引入了标准对象原型访问器"Object.getPrototype(object)")。

转载于:https://www.cnblogs.com/wangyueming/p/10006612.html

JavaScript 源型链相关推荐

  1. JavaScript开发区块链只需200行代码

    JavaScript开发区块链只需200行代码 用JavaScript开发实现一个简单区块链.通过这一开发过程,你将理解区块链技术是什么:区块链就是一个分布式数据库,存储结构是一个不断增长的链表,链表 ...

  2. JavaScript实现职责链模式

    什么是职责链模式 职责链模式的定义是:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.举个例子:当你从公 ...

  3. Javascript的原型链图

    90%的前端或者js程序员或者老师们对Javascript懂得不比这个多 给手机看的 但是这个图里的所有褐色单向箭头链就是Javascript的原型链(颜色标注对理解js原型链很关键) 这图中的各个_ ...

  4. 如何区分PLC输入是源型输入还是漏型输入?

    此问题说的是接近开关与PLC连接,以三线制接近开关为主. 谈及三线接近开关,要明白它的基本使用.三线制接近开关,工作电压24V,输出信号根据NPN型或PNP型呈现两种电平,即低电平或高电平. 至于PL ...

  5. JavaScript 原型 原型链

    JavaScript 原型 本文讲介绍JavaScript原型 以及JavaScript的原型链 JS中的原型和原型链 所有的引用类型(数组.函数.对象)可以自由扩展属性(除null以外) 所有的函数 ...

  6. 外链权重高的新闻源外链

    上网站推行的下场,每小我都在传说传闻baidu引擎新闻源外链权重高于通常搜罗分量,这一点今朝还没有文字.但作为新闻源的网站,它的分量,不变性能够确保,它是作为一个新闻源外链,其不乱性长短常高的. 新闻 ...

  7. [GYCTF2020]Ez_Express-原型链污染学习

    [GYCTF2020]Ez_Express-原型链污染学习 最近学习下nodejs相关的题目,所以做了这道题 进入题目界面长这样 简单的试了下功能,也就是一个登录注册按钮,登陆后如下所示 要求需要AD ...

  8. JavaScript中的链(作用域链、原型链)

    JavaScript中的链(作用域链.原型链) Js中存在两种链,作用域链和原型链.作用域链是为了访问变量而存在的链,原型链是访问对象的属性而存在的链. 作用域链 说到作用域链,首先来说下作用域的概念 ...

  9. JavaScript开发区块链只需200行代码 1

    使用JavaScript实现简单的开发一个区块链.通过javascript这一开发区块链的实现过程,你将会真正理解区块链是什么:区块链就是一个分布式数据库,存储结构是一个不断增长的链表,链表中包含着许 ...

最新文章

  1. Windows Phone 几种页面间传递数据的方式
  2. GitHub地图转误差坐标
  3. 和平精英微信和qq不是一个服务器,和平精英微信和QQ玩家能不能一起玩?微信和QQ怎么开黑建房[图]...
  4. 微信jssdk 图片上传 JAVA_微信jssdk图片上传
  5. 从流量控制算法谈网络优化-TCP核心原理理解
  6. SylixOS中select原理及使用分析
  7. hibernate jpa_使用Hibernate(JPA)一键式删除
  8. 指甲之指甲长期没有甲半月弧(二)
  9. php多维数组key交换,php 根据key计算多维数组的和功能实例
  10. channel is already closed due to channel error;
  11. java md5方法 for Android
  12. WordPress采集插件-WordPress文章自动采集发布
  13. 拉普拉斯(逆)变换的计算
  14. 关于Navicat Premium 12注册机被windows病毒防护自动删除的问题解决
  15. 机器学习——时间序列预测方法
  16. 软件项目规模度量与实际应用
  17. C语言代码覆盖率测试软件,代码覆盖率检测工具GCOV
  18. Hoj 1789 Electricity
  19. 【openjudge】金银岛
  20. Life feelings--6--有一天感到没有动力了怎么办?--怎样找到持久的热情?

热门文章

  1. keepalived 和 zookeeper的区别
  2. tomcat启动报错,找不到相应的 queue,从而引发内存泄漏
  3. [ACM_动态规划] hdu 1176 免费馅饼 [变形数塔问题]
  4. 开园第一篇献给找不回来的园子。。
  5. mysql profile使用(转)
  6. OSI(Open System Interconnect)开放式系统互联
  7. c++学习笔记(7) 面向对象思想
  8. android build获取ext,顶级build.gradle文件中的ext属性
  9. rda冗余分析步骤_FEMS Microbiol Ecol |微生物生态学中的多变量分析
  10. sed -i 单引号中嵌套双引号_【函数应用】IF函数的多层嵌套