图解:

  

一、普通对象 跟 函数对象

  JavaScript 中,一切皆对象。但对象也有区别,分为 普通对象函数对象,Object 和 Function 是 JavaScript 自带的函数对象。

var o1 = {};
var o2 =new Object();
var o3 = new f1(); function f1(){};
var f2 = function(){};
var f3 = new Function('str','console.log(str)'); console.log(typeof Object); //function
console.log(typeof Function); //function console.log(typeof f1); //function
console.log(typeof f2); //function
console.log(typeof f3); //function console.log(typeof o1); //object
console.log(typeof o2); //object
console.log(typeof o3); //object

  凡是通过 new Function() 创建的对象都是函数对象,其他的都是普通对象。

  f1,f2,归根结底都是通过 new Function()的方式进行创建的。

  Function Object 也都是通过 New Function()创建的。

二、构造函数

function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = function() { alert(this.name) }
}
var person1 = new Person('Zaxlct', 28, 'Software Engineer');
var person2 = new Person('Mick', 23, 'Doctor');

  上面的例子中 person1 和 person2 都是 Person 的实例。这两个实例都有一个 constructor(构造函数)属性,该属性(是一个指针)指向 Person。 即:

 console.log(person1.constructor == Person); //true
console.log(person2.constructor == Person); //true

  两个概念(构造函数,实例):
    person1 和 person2 都是 构造函数 Person 的实例。
  一个公式:
    实例的构造函数属性(constructor)指向构造函数。

    

三、原型对象(prototype)

  每个对象都有 __proto__ 属性,但是只有函数对象拥有 prototype 属性,该属性就是这个对象的原型。

Person.prototype = {
name: 'Zaxlct',
age: 28,
job: 'Software Engineer',
sayName: function() {
alert(this.name);
}
}

  在默认情况下,所有的原型对象都会自动获得一个 constructor(构造函数)属性,这个属性(是一个指针)指向 prototype 属性所在的函数(Person)。

Person.prototype.constructor == Person

四、__proto__

  JS 在创建对象时,都有一个叫做 __proto__ 的内置属性,用于指向创建它的构造函数的原型对象。

  对象 person1 有一个 __proto__ 属性,创建它的构造函数是 Person,构造函数的原型对象是 Person.prototype ,所以:

Person.prototype.constructor == Person;
person1.__proto__ == Person.prototype;
person1.constructor == Person;

五、原型链

  概念:

    对象寻找方法或者属性时,首先去自身上寻找,如果自身不带这个方法或者参数,就会去它原型上找,如果它原型上也没有,继续向上级原型(Function 或者 Object)去找,如果都没有,返回null。

    这样一个寻找过程产生的链条,就叫做 原型链。   

  小测试:

  1. person1.__proto__ 是什么?

  2. Person.__proto__ 是什么?

  3. Person.prototype.__proto__ 是什么?

  4. Object.__Proto__ 是什么?

  5. Object.Prototype.__proto__ 是什么?

  答案:

  第一题:

    person1.__proto__ === Person.prototype

  

  第二题:

    Person.__proto__ == Function.prototype

  

  第三题:

    Person.prototype.__proto__ == Object.prototype

  第四题:

    Object.__proto__ == Function.prototype

  第五题:

    Object.prototype 对象也有 __proto__ 属性,但它比较特殊,为 null 。因为 null 处于原型链的顶端,这个只能记住。

    Object.prototype.__proto__ === null

  

  所有 函数对象 的 __proto__ 都指向 Function.prototype,它是一个空函数(Empty function)

  所有对象的 __proto__ 都指向其构造器的 prototype

  原型链的形成是真正是靠 __proto__ 而非 prototype

  原型和原型链是JS实现继承的一种模型

随笔整理自
  https://www.jianshu.com/p/dee9f8b14771
  https://blog.csdn.net/haoaiqian/article/details/79825620
  http://www.cnblogs.com/snandy/archive/2012/09/01/2664134.html
感谢博主分享!

JS 原型与原型链的更多相关文章

  1. Js 原型和原型链

    Js中通过原型和原型链实现了继承 Js对象属性的访问,首先会查找自身是否拥有这个属性 如果查到,则返回属性值,如果找不到,就会遍历原型链,一层一层的查找,如果找到就会返回属性值 直到遍历完Object ...

  2. 【repost】JS原型与原型链终极详解

    一. 普通对象与函数对象  JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object ,Function 是JS自带的函数对象.下面举例说明 function f ...

  3. JS原型与原型链终极详解

    一. 普通对象与函数对象  JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object ,Function 是JS自带的函数对象.下面举例说明 function f ...

  4. JS原型与原型链终极详解(转)

    JavaScript原型及原型链详解 一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object,Function 是JS自带的函数对象. ...

  5. 总结一下js的原型和原型链

    最近学习了js的面向对象编程,原型和原型链这块是个难点,理解的不是很透彻,这里搜集了一些这方面的资料,以备复习所用 一. 原型与构造函数 Js所有的函数都有一个prototype属性,这个属性引用了一 ...

  6. JS原型和原型链

        1 var decimalDigits = 2, 2 tax = 5; 3 4 function add(x, y) { 5 return x + y; 6 } 7 8 function su ...

  7. 深入JS原型与原型链

    要了解原型和原型链,首先要理解普通对象和函数对象. 一.普通对象和函数对象的区别 在Javascript的世界里,全都是对象,而对象之间也是存在区别,我们首先区分一下普通对象和函数对象,如下代码: f ...

  8. JS对象、原型链

    忘记在哪里看到过,有人说鉴别一个人是否 js 入门的标准就是看他有没有理解 js 原型,所以第一篇总结就从这里出发. 对象 JavaScript 是一种基于对象的编程语言,但它与一般面向对象的编程语言 ...

  9. JS面向对象之原型链

      对象的原型链 只要是对象就有原型 原型也是对象 只要是对象就有原型, 并且原型也是对象, 因此只要定义了一个对象, 那么就可以找到他的原型, 如此反复, 就可以构成一个对象的序列, 这个结构就被成 ...

随机推荐

  1. Spring MVC 请求映射 (二)

    完整的项目案例: springmvc.zip 目录 实例 项目结构: 一.配置web.xml <?xml version="1.0" encoding="UTF-8 ...

  2. NVIDIA显卡笔记本安装ubuntu驱动以及分辨率之详解

    随着对ubuntu的了解,突然想在自己的笔记本上装一个双系统.在网上查了安装方法之后,发现因为nvidia显卡的原因会出现一些问题,结果在我自己装了之后发现问题要比看到的多,再看了无数个帖子之后,最终 ...

  3. Cs231n课堂内容记录-Lecture 3 最优化

    Lecture 4 最优化 课程内容记录: (上)https://zhuanlan.zhihu.com/p/21360434?refer=intelligentunit (下)https://zhua ...

  4. 安装window 7系统----计算机经验

    上期我们已经成功制作了U盘启动并且也成功进入了PE系统了,在PE微型系统中,除了简单的装系统来恢复C盘,还有什么功能你们可以使用的呢?如果这一期我没有把其他内容讲解的话,千万别乱搞,到时我可能会讲解几 ...

  5. Excel 单元格不能设置超链接

    最近在重做系统后  新安装office后 原先的Excel中设置的超链接不能正常使用了  如果新配置的超链接也不能使用 解决方法: 步骤1:打开开始菜单,在运行里输入regedit,回车 步骤2  在 ...

  6. linux中find命令高级用法

    前言 在<Linux中的文件查找技巧>一文中,我们已经知道了文件查找的基本方法,今天我们介绍find命令的一些高级使用技巧.它能满足我们一些更加复杂的需求. 查找空文件或空目录 有时候需要 ...

  7. 【Teradata】tdlocaledef修改默认日期配置

    如下所有操作需要使用root登录到TD数据库节点操作 1.获取数据库当前默认配置 //使用root登录TD数据库节点 cd /opt/teradata/tdat/tdbms/xx.xx.xx.xx/b ...

  8. 单页应用 - Token 验证

    单页应用 - Token 验证 转:https://juejin.im/post/58da720b570c350058ecd40f 第一次接触单页应用,记录公司项目关于Token验证知识. Token ...

  9. ElasticSearch(五):Java操作ElasticSearch执行查询

    package com.gxy.ESChap01; import java.net.InetAddress; import org.elasticsearch.action.search.Search ...

  10. Druid、BoneCP、DBCP、C3P0等主流数据库对比

    关键功能 Druid BoneCP DBCP C3P0 Proxool JBoss LRU 是 否 是 否 是 是 PSCache 是 是 是 是 否 是 PSCache-Oracle-Optimiz ...