• JavaScript原型简单理解


    原型:本质上也是一个对象,其他对象可以通过它实现属性继承。所有对象在默认情况下都有一个原型。多个实例共享一个通用原型,原型属性一旦定义,就可以被多个引用它的实例所继承。

    prototype是构造函数的一个属性, 该属性指向一个对象. 而这个对象将作为该构造函数所创建的所有实例的基引用, 可以把对象的基引用想像成一个自动创建的隐藏属性. 当访问对象的一个属性时, 首先查找对象本身, 找到则返回; 若不, 则查找基引用指向的对象的属性(如果还找不到实际上还会沿着原型链向上查找,  直至到根). 只要没有被覆盖的话, 对象原型的属性就能在所有的实例中找到。

    function Person(name) {
        this.name = name;
    }
    Person.prototype.sayName = function(){
        alert(this.name);
    }
    var john = new Person("John"); 
    var aim = new Person("aim");  
    john.sayName(); // john对象本身没有sayName属性, 于是访问原型对象p_obj的sayName属性
    aim.sayName(); // 访问同一个原型对象p_obj的sayName属性

    原型链:由一些用来继承和共享属性的对象组成的对象链。基本思想:让原型对象等于另一个类型的实例,这样原型对象将包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数的指针,假如另一个原型又是另一个类型的实例,层层递进,构成了实例与原型的链条,即原型链。Eg.当我们访问一个对象的属性时候,如果该对象不含有这个属性,那么则可以去该对象的原型查找,原型又有原型属性,如此沿着原型链查找下去,如果到object对象的原型还找不到该属性,才说明该属性不存在。原型链将每个实例都链接到其构造函数的prototype属性,即任何时候使用new关键字由构造函数创建对象时,它都会在创建对象实例和创建对象的构造函数的prototype属性之间添加一个隐藏的链接,该链接在实例中被称为_proto_。构造函数被调用时,JavaScript在后台将这一切链接起来,这个链接使得原型链成为一个链。

    因为每个对象和原型都有一个原型(注:原型也是一个对象),对象的原型指向对象的父,而父的原型又指向父的父,我们把这种通过原型层层连接起来的关系称为原型链。这条链的末端一般总是默认的对象原型。当我们需要查找属性或方法时,先到当前对象中查找,如果不存在,再向该对象的原型查找,仍然不存在,则继续向该对象的父查找,如此沿着原型链一层层地往上查找,直到找到该属性或方法或者直到查找到object.prototype。

    构造函数、原型、实例的关系:

    函数都有一个prototype属性,这是一个指针,指向了这个函数的原型对象;这个对象包含这个函数创建的实例的共享属性和方法。即原型对象中的属性和方法为所有实例所共享。这个原型对象有一个constructor属性,指向了该构造函数,每个通过该构造函数创建的对象都包含一个指向原型对象的内部指针_proto_。

    Ps:JavaScript的对象是由构造函数创建的, 每个对象都有constructor属性表示创建该对象的构造函数。

    prototype属性:JavaScript为每一个函数实例创建的一个对象。即通过new关键字创建的对象实例链接回创建它们的构造函数。因此实例才可以共享或继承通用属性和方法。重要的是,共享发生在属性查找时。

    Ps:JavaScript会为每个函数创建原型对象,即使该函数不作为构造函数使用。函数的原型属性(prototype property )是一个对象,当这个函数被用作构造函数来创建实例时,该函数的原型属性将被作为原型赋值给所有对象实例。即所有实例的原型引用的是构造函数的原型属性。

    eg. var myArray=new Array();

       console.log(myArray.join());

    对象myArray并没有定义join()方法,但是却可以访问join()方法,原因就在于原型属性的存在,因为Array数组本身含有join()方法,因此JavaScript会在myArray的原型链中找到join()方法。

    对象通过一个内部属性绑定到它的原型。对象可以有两种成员类型:实例成员和原型成员。实例成员直接存在于对象实例中,原型成员则从对象原型继承而来。

       

    原型链维持:使用一个对象的实例作为另外一个对象的原型。

     。。。。。。

    宝剑锋从磨砺出,梅花香自苦寒来。
  • 相关阅读:
    python之xlwt模块列宽width、行高Heights详解
    Testlink在CentOS、windows安装
    Appium中长按按钮操作
    CentOS oracle Client客户端安装
    WebDriver中自动识别验证码--Python实现
    shell批量重命令文件脚本
    MFC 显示图片
    MFC CEdit控件 自动换行
    第一次社会
    undefined reference 问题各种情况分析
  • 原文地址:https://www.cnblogs.com/haimengqingyuan/p/6392146.html
Copyright © 2020-2023  润新知