JavaScript 源型链
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 源型链相关推荐
- JavaScript开发区块链只需200行代码
JavaScript开发区块链只需200行代码 用JavaScript开发实现一个简单区块链.通过这一开发过程,你将理解区块链技术是什么:区块链就是一个分布式数据库,存储结构是一个不断增长的链表,链表 ...
- JavaScript实现职责链模式
什么是职责链模式 职责链模式的定义是:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.举个例子:当你从公 ...
- Javascript的原型链图
90%的前端或者js程序员或者老师们对Javascript懂得不比这个多 给手机看的 但是这个图里的所有褐色单向箭头链就是Javascript的原型链(颜色标注对理解js原型链很关键) 这图中的各个_ ...
- 如何区分PLC输入是源型输入还是漏型输入?
此问题说的是接近开关与PLC连接,以三线制接近开关为主. 谈及三线接近开关,要明白它的基本使用.三线制接近开关,工作电压24V,输出信号根据NPN型或PNP型呈现两种电平,即低电平或高电平. 至于PL ...
- JavaScript 原型 原型链
JavaScript 原型 本文讲介绍JavaScript原型 以及JavaScript的原型链 JS中的原型和原型链 所有的引用类型(数组.函数.对象)可以自由扩展属性(除null以外) 所有的函数 ...
- 外链权重高的新闻源外链
上网站推行的下场,每小我都在传说传闻baidu引擎新闻源外链权重高于通常搜罗分量,这一点今朝还没有文字.但作为新闻源的网站,它的分量,不变性能够确保,它是作为一个新闻源外链,其不乱性长短常高的. 新闻 ...
- [GYCTF2020]Ez_Express-原型链污染学习
[GYCTF2020]Ez_Express-原型链污染学习 最近学习下nodejs相关的题目,所以做了这道题 进入题目界面长这样 简单的试了下功能,也就是一个登录注册按钮,登陆后如下所示 要求需要AD ...
- JavaScript中的链(作用域链、原型链)
JavaScript中的链(作用域链.原型链) Js中存在两种链,作用域链和原型链.作用域链是为了访问变量而存在的链,原型链是访问对象的属性而存在的链. 作用域链 说到作用域链,首先来说下作用域的概念 ...
- JavaScript开发区块链只需200行代码 1
使用JavaScript实现简单的开发一个区块链.通过javascript这一开发区块链的实现过程,你将会真正理解区块链是什么:区块链就是一个分布式数据库,存储结构是一个不断增长的链表,链表中包含着许 ...
最新文章
- Windows Phone 几种页面间传递数据的方式
- GitHub地图转误差坐标
- 和平精英微信和qq不是一个服务器,和平精英微信和QQ玩家能不能一起玩?微信和QQ怎么开黑建房[图]...
- 微信jssdk 图片上传 JAVA_微信jssdk图片上传
- 从流量控制算法谈网络优化-TCP核心原理理解
- SylixOS中select原理及使用分析
- hibernate jpa_使用Hibernate(JPA)一键式删除
- 指甲之指甲长期没有甲半月弧(二)
- php多维数组key交换,php 根据key计算多维数组的和功能实例
- channel is already closed due to channel error;
- java md5方法 for Android
- WordPress采集插件-WordPress文章自动采集发布
- 拉普拉斯(逆)变换的计算
- 关于Navicat Premium 12注册机被windows病毒防护自动删除的问题解决
- 机器学习——时间序列预测方法
- 软件项目规模度量与实际应用
- C语言代码覆盖率测试软件,代码覆盖率检测工具GCOV
- Hoj 1789 Electricity
- 【openjudge】金银岛
- Life feelings--6--有一天感到没有动力了怎么办?--怎样找到持久的热情?
热门文章
- keepalived 和 zookeeper的区别
- tomcat启动报错,找不到相应的 queue,从而引发内存泄漏
- [ACM_动态规划] hdu 1176 免费馅饼 [变形数塔问题]
- 开园第一篇献给找不回来的园子。。
- mysql profile使用(转)
- OSI(Open System Interconnect)开放式系统互联
- c++学习笔记(7) 面向对象思想
- android build获取ext,顶级build.gradle文件中的ext属性
- rda冗余分析步骤_FEMS Microbiol Ecol |微生物生态学中的多变量分析
- sed -i 单引号中嵌套双引号_【函数应用】IF函数的多层嵌套