图解JavaScript原型和原型链

基础了解

Javascript对象可以分为两类:

  1. 普通对象 ,除了函数对象之外的对象都是,包括new函数对象()产生的实例,普通对象没有prototype,也就没有继承和原型链一说。
  2. 函数对象 ,包括两种:
  • 由function创造出来的函数:

        function f1() {
    
        } // 匿名函数
    
        var f2 = function() {
    
        }
    
        var f3 = new Function(‘x‘,‘console.log(x)‘);
    
        // 以上都是函数对象
  • 系统内置的函数对象:

Function,Object,Array,String,Number

进入正题

上图解释了__proto__、原型对象prototype、构造函数constructor的复杂关系,下面有解释。

解释各个对象的含义

  • function Foo() 即 Foo类

function Foo() {

    this.name = ‘xxx‘;

    ...

} // 构造函数

Foo.prototype.sayName = function() {

    console.log(this.name);

} // 原型对象
  • function Object() 即 js内置对象Object,在javascript中所有的对象都继承自Object。这里用function xxx()表示是因为构造Object对象的源码就是如此,即Object也是类似函数的构造方式。
  • function Function() 即 js内置对象Function。
  • f1,f2 表示 Foo的实例对象
  • o1,o2 表示 Object的实例对象
  • xxx.prototype 表示xxx的原型对象

原型和原型链

原型

1)prototype

即原型对象,只有函数对象有prototype属性,它的主要作用就是继承,将其中定义的属性和方法传递给‘后代’(比如实例化)

2)__proto__

每个对象都有__proto__属性,它的主要作用是储存继承得来的方法和属性。

3)如何继承

以f1为例,继承的过程可以表示为f1.__proto__ = Foo.prototype,即对象.__proto__ = 构造器.prototype,上面的图形可以完全参照这个公式来理解。

原型链

1) f1的原型链。

  1. f1为普通对象,它的构造器为Foo,以Foo为原型,原型链第一链为f1.__proto__ == Foo.prototype
  2. Foo.prototype(注意这边不是Foo)为json对象,即普通对象,构造器为Object,以Object为原型,得出原型链第二链Foo.prototype.__proto__ == Object.prototype;
  3. Object.prototype以Null为原型,原型链第三链为Object.prototype.__proto__ == null

f1的原型链可以用图形表示:

可以在浏览器console打印验证:

2) Foo的原型链

  1. Foo为函数对象,它的构造器为Function,以Function为原型,原型链第一链为Foo.__proto__ == Function.prototype;
  2. Function.prototype为json对象,即普通对象,构造器为Object,以Object为原型,原型链第二链为Function.prototype.__proto__ == Object.prototype;
  3. 最后Object.prototype以Null为原型,原型链第三链为Object.prototype.__proto__ == null;

Foo的原型链可以用图形表示为:

可以在浏览器console打印验证:

3)小结

列出两种原型链的目的是:

当js引擎执行对象的属性或方法时,先查找对象本身是否存在该方法,如果不存在则会在原型链上查找。因而f1拥有Foo、Object的原型方法,Foo拥有Function、Object的原型方法。注意,虽然f1原型链其中有一链是涉及到函数对象Foo,但f1并不拥有Function的原型方法,因为原型链并没有延伸到Function。

上图中bind是Function的原型方法,f1并没有拥有。

总结

如何找出一个对象的原型链,只需要两步

  1. 判断对象是普通对象还是函数对象,得出对象的构造器
  2. 对象.proto = 构造器.prototype

关于最上面的图形,只剩Object和Function的特殊关系和构造函数constructor没有讲到,如果有讲不清和讲错了的地方,请帮我指出来,我也跟大家一起在学习中,请轻喷(●ˇ?ˇ●)

原文地址:https://www.cnblogs.com/chenyunA/p/9213511.html

时间: 2024-11-04 08:38:45

图解JavaScript原型和原型链的相关文章

图解JavaScript中的原型链

转自:http://www.jianshu.com/p/a81692ad5b5d typeof obj 和 obj instanceof Type 在JavaScript中,我们经常用typeof obj和obj instanceof Type来识别类型,那么两者的区别在哪?先来看两段代码 <!--typeof obj的方式判断--> <script>    var str = "toby";    console.log(typeof str);// stri

图解Javascript原型链

本文尝试阐述Js中原型(prototype).原型链(prototype chain)等概念及其作用机制.上一篇文章(图解Javascript上下文与作用域)介绍了Js中变量作用域的相关概念,实际上关注的一个核心问题是:“在执行当前这行代码时Js解释器可以获取哪些变量”,而原型与原型链实际上还是关于这一问题. 我们知道,在Js中一切皆为对象(Object),但是Js中并没有类(class):Js是基于原型(prototype-based)来实现的面向对象(OOP)的编程范式的,但并不是所有的对象

javascript中的构造函数和原型及原型链

纯属个人理解,有错误的地方希望大牛指出,以免误人子弟 1.构造函数: 构造函数的作用 : 初始化由new创建出来的对象    new 的作用: 创建对象(空对象) new 后面跟的是函数调用,使用new来调用函数,跟普通的直接调用函数主要的不同: 就是 this 的指向不同了 , 再就是 会自动的返回新创建的对象 什么是原型?        原型的作用:就是为了实现继承!  一个对象的原型就是它的构造函数的prototype属性的值. 在讨论原型的时候,是指的 对象和原型对关系 prototyp

JavaScript核心-继承-原型链

继承是面向对象的编程的一大特性,很多OO语言都支持两种继承方式:接口继承和实现继承.在ECMAScript中,由于函数没有签名,所以无法实现接口继承,只有实现继承. 实现继承主要是依靠原型链来实现的. 简单回顾一下构造函数.原型和实例的关系:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而对象的每个实例都有一个指向原型对象的内部指针. 再回顾一下原型对象的用途:用途是包含可以由特定类型的所有实例共享的属性和方法. 原型对象也是一个简单的对象,如果我们让一个原型对象等于另一个

Javascript 原型和原型链

先来了解一下Javascript中的原型:”原型也是一个对象,原型可以用来实现继承...“ 对于 原型,构造函数,以及实例之间的关系:“每个(构造)函数都有一个原型属性,原型对象都包含一个指向构造函数的指针,每个实例都包含一个指向原型对象的指针.” 举个例子: 1 function Student(name) { 2 this.name = name; 3 } 4 var stu = new Student("xiao ming"); Student 函数有个prototype的属性,

介绍下Javascript原型和原型链的特点?

JavaScript原型: 每个对象都会在其内部初始化一个属性,就是prototype(原型). 原型链: 当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么他就会去prototype里找这个属性,这个prototype又会有自己的prototype,于是就这样一直找下去,也就是我们平时所说的原型链的概念. 特点: JavaScript对象是通过引用来传递的,我们创建的每个新对象实体中并没有一份属于自己的原型副本.当我们修改原型时,与之相关的对象也会继承这一改变.

JavaScript学习总结(五)原型和原型链详解

转自:http://segmentfault.com/a/1190000000662547 私有变量和函数 在函数内部定义的变量和函数,如果不对外提供接口,外部是无法访问到的,也就是该函数的私有的变量和函数. <script type="text/javascript"> function Box(){ var color = "blue";//私有变量 var fn = function() //私有函数 { } } </script> 这

javascript面向对象系列5——知识点(原型和原型链)

基本概念 [原型链]每个构造函数都有一个对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针.那么,如果原型对象等于另一个原型的实例,此时的原型对象将包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数的指针.如果另一个原型又是另一个原型的实例,那么上述关系依然成立.如此层层递进,就构成了实例与原型的链条. [原型对象]这个对象包含可以由特定类型的所有实例共享的属性和方法.所有引用类型默认都继承了Object,而这个继承也是通过原型链实现

javascript中的原型与原型链

javascript是一门面向对象的语言,但它却没有像其他面向对象的语言(如java,C++)有类的概念,也没有基于类的继承体系.但是它有自己独特的继承方式,那就是基于原型和原型链的继承. 当我们创建一个对象时,每个对象在生成之后都有一个隐式的属性__proto__(非规范,暂且这么叫吧),该属性指向该实例的原型对象,并共享其原型对象上的属性和方法. 下面分析下不同创建对象的方式所对应的__proto__属性指向的不同. 1.用对象字面量创建对象. var a={x:1}; console.lo