先看看最简单的栗子:

//构造函数
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原型和原型链的更多相关文章

  1. 图解JavaScript中的原型链

    转自:http://www.jianshu.com/p/a81692ad5b5d typeof obj 和 obj instanceof Type 在JavaScript中,我们经常用typeof o ...

  2. 图解Javascript——作用域、作用域链、闭包

    什么是作用域? 作用域是一种规则,在代码编译阶段就确定了,规定了变量与函数的可被访问的范围.全局变量拥有全局作用域,局部变量则拥有局部作用域. js是一种没有块级作用域的语言(包括if.for等语句的 ...

  3. 图解Javascript原型链

    本文尝试阐述Js中原型(prototype).原型链(prototype chain)等概念及其作用机制.上一篇文章(图解Javascript上下文与作用域)介绍了Js中变量作用域的相关概念,实际上关 ...

  4. javascript中的原型和原型链(三)

    1. 图解原型链 1.1 “铁三角关系”(重点) function Person() {}; var p = new Person(); 这个图描述了构造函数,实例对象和原型三者之间的关系,是原型链的 ...

  5. JavaScript继承与原型链

    对于那些熟悉基于类的面向对象语言(Java 或者 C++)的开发者来说,JavaScript 的语法是比较怪异的,这是由于 JavaScript 是一门动态语言,而且它没有类的概念( ES6 新增了c ...

  6. 【javascript基础】4、原型与原型链

    前言 荒废了好几天,在宿舍闷了几天了,一直想着回家放松,什么也没搞,论文就让老师催吧.不过,闲的没事干的感觉真是不好,还是看看书,写写博客吧,今天和大家说说函数的原型. 原型是什么 第一次看到这个的时 ...

  7. 【JavaScript】深入理解JavaScript之强大的原型和原型链

    由于JavaScript是唯一一个被广泛使用的基于原型继承的语言,所以理解两种继承模式的差异是需要一定时间的,今天我们就来了解一下原型和原型链. AD: hasOwnProperty函数: hasOw ...

  8. Javascript 原型和原型链

    先来了解一下Javascript中的原型:”原型也是一个对象,原型可以用来实现继承...“ 对于 原型,构造函数,以及实例之间的关系:“每个(构造)函数都有一个原型属性,原型对象都包含一个指向构造函数 ...

  9. javascript 原型 和 原型链

    最近几天,好些新同事来问原型,原型链啥的.本身作为菜鸟的我好像也没有好好整理过这个,这里写写自己的理解. 原型 大家都知道,JavaScript 不包含传统的类继承模型,而是使用 prototype ...

随机推荐

  1. 新概念英语(1-105)Full Of Mistakes

    Lesson 105 Full of mistakes 错误百出 Listen to the tape then answer this question. What was Sandra's pre ...

  2. 双击表,powerdesigner pdm 没有 comment列(no comment)

  3. LinkedHashMap就这么简单【源码剖析】

    前言 声明,本文用得是jdk1.8 前面已经讲了Collection的总览和剖析List集合以及散列表.Map集合.红黑树还有HashMap基础了: Collection总览 List集合就这么简单[ ...

  4. 使用 C# (.NET Core) 实现命令设计模式 (Command Pattern)

    本文的概念内容来自深入浅出设计模式一书. 项目需求 有这样一个可编程的新型遥控器, 它有7个可编程插槽, 每个插槽可连接不同的家用电器设备. 每个插槽对应两个按钮: 开, 关(ON, OFF). 此外 ...

  5. Linux(一)VMware虚拟机的安装

    vmware的安装文件: 链接:https://pan.baidu.com/s/1QGjNqRZzE-vV7Af0PI2QYA 密码:omfe 1.1 首先下载安装包 安装包的内容 1.2 双击exe ...

  6. 使用poi根据模版生成word文档,支持插入数据和图片

    一.制作word模版,${xxxx}是一会要替换的内容,最下面的表格是要插入数据,根据是否以$开头来判断是需要替换还是插入数据, 注意如果是需要插入数据,制作的表格模版需要一行空行,也只能有一行空行, ...

  7. BZOJ 4551[Tjoi2016&Heoi2016]树(树链剖分+二分)

    Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记 ...

  8. SQL SERVER 索引名前缀代表的意思

    PK - Primary Key IX - Non-Unique Index AK - Unique Index (AX should have been AK (Alternate Key)) CK ...

  9. 重拾Python(4):Pandas之DataFrame对象的使用

    Pandas有两大数据结构:Series和DataFrame,之前已对Series对象进行了介绍(链接),本文主要对DataFrame对象的常用用法进行总结梳理. 约定: import pandas ...

  10. [USACO 08JAN]Haybale Guessing

    Description The cows, who always have an inferiority complex about their intelligence, have a new gu ...