zoukankan      html  css  js  c++  java
  • 原型链

    原型链

    1、原型对象

    在Javascript中,每个构造函数在加载后都会在内存中自动生成一个原型对象,我们可以通过prototype属性来访问该对象。

    每个构造函数定义后都会创建一个原型对象,不需要创建对象。构造函数中的prototype只能用 类名.prototype去访问,constructor 只能用对象去访问

    Person构造器与Person原型对象在内存中表现为相互独立,但是在Person构造函数的内部存在一个prototype属性指向了Person原型对象。同理,在Person原型对象的内部也存在一个属性constructor其指向了Person构造器。

    2、原型对象的作用

    当构造器的实例化对象p1访问一个不存在的属性或方法时,系统会自动到当前构造器所指向的原型对象中去寻找。

    说明:Person构造器的实例化对象p1访问一个不存在的属性constructor,系统会自动到当前Person构造器的原型对象中去寻找constructor属性,由于原型对象中的constructor属性指向了Person构造器,所以当我们调用p1.constructor时,系统会自动弹出Person构造器。

    给原型对象添加属性后创建的所有对象都是可以访问

    3、原型对象的应用场景

    在实际项目开发中,我们可能会经常使用系统类或别人定义好的类文件,如果发现类中并不存在我们需要的属性或方法,我们不能直接修改源代码,也不愿为每个对象都单独定义相关属性和方法,那么不妨考虑使用原型对象对其进行扩展。

     

    例1:使用原型对象,扩展自定义类

     

    例2:扩展数组类的功能,为每一个数组对象添加一个方法,可以查找某个元素的所在位置

    var arr = [10,20,30,40,50];

    arr.find(30); //返回30所在数组的索引下标2

    4、探究原型对象从何而来

    问题:既然原型对象也是一个对象,那么其又是由哪个类实例化而来呢?

    记住:所有的原型对象在实例化时都会自动执行以下代码

    (构造器名称.prototype) = new Object();

    所以,由以上代码可知:所有的原型对象都是Object类的实例化,在Javascript中,Object是所有类的基类(父类)。

    原型对象是由object 类的实例化来的

    所有的原型对象都是由Object构造器实例化而来的,所以原型对象都会自动继承Object类中所有属性和方法,又由于某个类的实例化对象(如p1对象)访问一个不存在的属性或方法时,系统首先到当前构造器的原型对象中去寻找,由于原型对象又继承了Object类,所以实例化对象也会自动继承Object类中的所有属性或方法,我们把这种继承关系就称之为"原型继承"。

     

    证明:原型继承的存在

    所以可以得出结论:所有的对象(无论是系统类对象还是自定义对象)都会自动继承Object类中的所有属性和方法,所以Object是所有类的基类(父类)

    5、原型链

    当Person构造器的实例化对象p1访问一个不存在的属性或方法时,系统会自动到Person构造器所指向的原型对象中去寻找,如找不到则会继续向上一级构造器所指向的原型对象中去寻找,直到Object构造器所指向的原型对象,我们把这种链式的查询关系就称之为"原型链"。

    如果一个person类的对象访问一个对象中没有的属性,就会到person的原型对象中去寻找,如果找不到就去object的原型对象中去寻找,这就是原型链

    证明:原型链的存在

  • 相关阅读:
    Spring -- spring 和 hibernate 整合
    文件:一个任务
    文件:因为懂你,所以永恒
    集合:在我的世界里,你就是唯一
    总结回顾
    快速排序的优化
    快速排序
    归并排序(迭代实现)- 数据结构和算法95
    归并排序(递归实现)- 数据结构和算法94
    堆排序的代码实现
  • 原文地址:https://www.cnblogs.com/nyxd/p/5364568.html
Copyright © 2011-2022 走看看