图解JavaScript原型和原型链
先看看最简单的栗子:
//构造函数
function People(name, age){
this.name = name;
this.age = age;
} //原型对象(所有由构造函数实例而来的对象都继承自这个对象)
People.prototype = {
constructor:People, //显式设置构造函数的反向引用,避免实例的constructor属性指向Object函数
introduce:function(){ console.log(this.name + '今年' + this.age + '岁'); },
speak:function(x){ console.log(this.name + "会讲" + x + "语言"); }
} let p1= new Person('leaf',12);
let p2 = new Person('kafu',13); console.log(p1.__proto__===People.prototype); //true
console.log(People.prototype.constructor===People); //true
console.log(Object.getPrototypeOf(p1));
先说明几个概念再上图
1、prototype
每个函数都有一个prototype属性,这个属性值是一个对象。而构造函数的
prototype属性被用作新对象的原型, 也就是实例的原型。
在ECMAScript5中,该属性是不能被直接读取或修改的,但是可以通过Object.getPrototypeOf()间接的读取到它.
作用:实现类的扩充、类之间的继承
2、__proto__
js对象(除了null)都"具有"的这个属性,这个属性会指向该对象的原型。
”具有”,它并不存在与Person.prototype中,实际上,它是来自于Object.prototype。
即:p1.__proto__ === People.prototype
作用:创建一个以指定对象为原型的对象,以及,为内置类型添加子类型。
3、constructor
前面讲到,每个函数都有一个prototype属性,这个属性值是一个对象,这个对象包含唯一一个不可枚举的
属性constructor,constructor属性的值是一个函数对象, 它始终指向创建当前对象的构造函数。即:People.prototype.constructor===People,其实实例.constructor也指向了构造函数;这里有一个坑!看下面
4、prototype和constructor之坑
当我们给原型对象添加新方法时候,如果我们是改写People.prototype,比如
People.prototype={
getName:function(){
return this name;
}
}
此时我们再去打印console.log(People.prototype.constructor===People) //false
why?
因为当重写People.prototype对象的时候,相当于
Person.prototype = new Object({
getName: function() {
return this.name;
}
});
那此时People.prototype对象的构造函数是不是就是 Object了?而constructor始终指向创建当前对象的构造函数,所以此时:People.prototype.constructor===Object了。
修正方法:
可以重新覆盖People.prototype.constructor,即People.prototype.constructor===People;
或者不该重写People.prototype,添加属性,直接在后面加就可以了。
People.prototype.method1=...
People.prototype.method2=...
5、实例与原型
当读取实例的属性时,如果找不到,就会查找与对象关联的原型中的属性,如果还查不到,就去找原型的原型,一直找到最顶层为止。
6、原型链
如图中红色线形成的链状结构,一直指到null。
7、图解

图解JavaScript原型和原型链的更多相关文章
- 图解JavaScript中的原型链
转自:http://www.jianshu.com/p/a81692ad5b5d typeof obj 和 obj instanceof Type 在JavaScript中,我们经常用typeof o ...
- 图解Javascript——作用域、作用域链、闭包
什么是作用域? 作用域是一种规则,在代码编译阶段就确定了,规定了变量与函数的可被访问的范围.全局变量拥有全局作用域,局部变量则拥有局部作用域. js是一种没有块级作用域的语言(包括if.for等语句的 ...
- 图解Javascript原型链
本文尝试阐述Js中原型(prototype).原型链(prototype chain)等概念及其作用机制.上一篇文章(图解Javascript上下文与作用域)介绍了Js中变量作用域的相关概念,实际上关 ...
- javascript中的原型和原型链(三)
1. 图解原型链 1.1 “铁三角关系”(重点) function Person() {}; var p = new Person(); 这个图描述了构造函数,实例对象和原型三者之间的关系,是原型链的 ...
- JavaScript继承与原型链
对于那些熟悉基于类的面向对象语言(Java 或者 C++)的开发者来说,JavaScript 的语法是比较怪异的,这是由于 JavaScript 是一门动态语言,而且它没有类的概念( ES6 新增了c ...
- 【javascript基础】4、原型与原型链
前言 荒废了好几天,在宿舍闷了几天了,一直想着回家放松,什么也没搞,论文就让老师催吧.不过,闲的没事干的感觉真是不好,还是看看书,写写博客吧,今天和大家说说函数的原型. 原型是什么 第一次看到这个的时 ...
- 【JavaScript】深入理解JavaScript之强大的原型和原型链
由于JavaScript是唯一一个被广泛使用的基于原型继承的语言,所以理解两种继承模式的差异是需要一定时间的,今天我们就来了解一下原型和原型链. AD: hasOwnProperty函数: hasOw ...
- Javascript 原型和原型链
先来了解一下Javascript中的原型:”原型也是一个对象,原型可以用来实现继承...“ 对于 原型,构造函数,以及实例之间的关系:“每个(构造)函数都有一个原型属性,原型对象都包含一个指向构造函数 ...
- javascript 原型 和 原型链
最近几天,好些新同事来问原型,原型链啥的.本身作为菜鸟的我好像也没有好好整理过这个,这里写写自己的理解. 原型 大家都知道,JavaScript 不包含传统的类继承模型,而是使用 prototype ...
随机推荐
- Step by Step 真正从零开始,TensorFlow详细安装入门图文教程!帮你完成那个最难的从0到1
摘要: Step by Step 真正从零开始,TensorFlow详细安装入门图文教程!帮你完成那个最难的从0到1 安装遇到问题请文末留言. 悦动智能公众号:aibbtcom AI这个概念好像突然就 ...
- apollo1.7.1初探(二)使用apollo订阅主题,发布主题消息
一.MQTT协议配置 为了使用MQTT协议,首先使用MQTT3.1协议的客户端连接到Apollo正在监听端口.Apollo会做协议检测,而且自动识别MQTT连接,而且将连接作为MQTT协议处理. 你不 ...
- redis入门(03)redis的配置
一.配置文件 Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf.你可以通过 CONFIG 命令查看或设置配置项. 二.查看修改 1.查看配置 1.1.vi redis ...
- gradle入门(1-2)gradle的依赖管理
Gradle支持以下仓库格式: Ivy仓库 Maven仓库 Flat directory仓库 一.添加仓库 1.添加Ivy仓库 1.1.通过URL地址添加一个Ivy仓库 我们可以将以下代码片段加入到b ...
- cmd编译运行java
新建.java结尾的文件 内容 public class hello{ public static void main(String[] args){ System.out.println(" ...
- Python模块 - os , sys.shutil
os 模块是与操作系统交互的一个接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录: ...
- ICC_lab总结——ICC_lab5:布线&&数字集成电路物理设计学习总结——布线
字丑,禁止转载! 这里将理论总结和实践放在一起了. 布线的理论总结如下所示: 下面是使用ICC进行实践的流程: 本次的布线实验主要达成的目标是: ·对具有时钟树布局后的设计进行可布线性检查 ·完成布线 ...
- JAVA通过注解处理器重构代码,遵循单一职责
前言:最近在看一个内部网关代码的时候,发现处理Redis返回数据这块写的不错,今天有时间好好研究下里面的知识点. 业务流程介绍: #项目是采用Spring Boot框架搭建的.定义了一个@Redis注 ...
- Angular1.x使用小结
之前工作以Angular1.x为主,主要做业务系统,以后工作中技术栈可能以vue为主,在此对Angular1.x的使用做一个简单总结,这里使用1.5+版本. 基本概念 1.依赖注入 依赖注入,在ang ...
- js 一些基础的理解
javascript(JS)的组成? DOM 文档对象模型 BOM 浏览器对象模型 ECMAScript javascript(JS)在页面中处理了什么事情? 特效交互 数据交互 逻辑操作 常见特效的 ...