• js继承机制之prototype属性


    http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html

    我一直很难理解Javascript语言的继承机制。
    它没有"子类"和"父类"的概念,也没有"类"(class)和"实例"(instance)的区分,全靠一种很奇特的"原型链"(prototype chain)模式,来实现继承。

    如何在JavaScript实现OO编程?恐怕最好的方式就是充分利用prototype属性。

    比较基本的原理是,当你用prototype编写一个类后,当你new一个新的object,浏览器会自动把prototype中的内容替你附加在object上。这样,通过利用prototype,你也就实现了类似OO的Javascript。
    可以理解成:
    在Javascript中,一个function就是一个类。当你编写如下function时,其实就是定义了一个类,该function就是它的构造函数。

    function MyObject(name, size)
           {
                  this.name = name;
                  this.size = size;
           }
    

    之后,你可以方便的通过MyObject类的prototype属性来方便的扩充它。比如,你可以给他添加其他的属性和方法。

           MyObject.prototype.tellSize = function()
           {
                  return "size of "+this.name+" is "+this.size;
           }
          
           MyObject.prototype.color = "red";
           MyObject.prototype.tellColor = function()
           {
                  return "color of "+this.name+" is "+this.color;
           }
          
           var myobj1 = new MyObject("tiddles", "7.5 meters");
           domDiv.innerHTML += myobj1.tellColor()+"<br /><br />";
    

    你可以想象,当你调用tellColor()方法后,结果是这样的:

    color of tiddles is red
    

    很方便的是,prototype属性可以动态添加。比如,你需要往MyObject中加入一个height属性,并希望其提供一个tellHeight()方法来获得height属性的值。你可以在上面的代码后,继续添加如下的代码:

           MyObject.prototype.height = "2.26 meters";
           MyObject.prototype.tellHeight = function()
           {
                  return "height of "+this.name+" is "+this.height;
           }
    

    之后,你可以访问一下myobj1的tellHeight()方法,你可以得到如下的结果:

    height of tiddles is 2.26 meters
    

    prototype属性的引入##

    考虑到这一点,Brendan Eich决定为构造函数设置一个prototype属性。
    这个属性包含一个对象(以下简称"prototype对象"),所有实例对象需要共享的属性和方法,都放在这个对象里面;那些不需要共享的属性和方法,就放在构造函数里面。
    实例对象一旦创建,将自动引用prototype对象的属性和方法。也就是说,实例对象的属性和方法,分成两种,一种是本地的,另一种是引用的。
    还是以DOG构造函数为例,现在用prototype属性进行改写:

      function DOG(name){
        this.name = name;
      }
      DOG.prototype = { species : '犬科' };//prototype对象
    
      var dogA = new DOG('大毛');
      var dogB = new DOG('二毛');
    
      alert(dogA.species); // 犬科
      alert(dogB.species); // 犬科
    

    现在,species属性放在prototype对象里,是两个实例对象共享的。只要修改了prototype对象,就会同时影响到两个实例对象。

      DOG.prototype.species = '猫科';
    
      alert(dogA.species); // 猫科
      alert(dogB.species); // 猫科
    

    由于所有的实例对象共享同一个prototype对象,那么从外界看起来,prototype对象就好像是实例对象的原型,而实例对象则好像"继承"了prototype对象一样。

  • 相关阅读:
    git命令
    Java开发中的23种设计模式详解
    Linux下简单基本操作【备查】
    微信|公众平台开发者平台
    MyEclipse老是弹出problem occurred窗口
    spring 工具包怎么下载
    MyEclipse8.6启动后提示内存不足的解决方案(亲测,完美解决)
    bzoj2440,luoguP4318 完全平方数
    hdu5528
    CF1076E Vasya and a Tree
  • 原文地址:https://www.cnblogs.com/godot-blog/p/6730512.html
Copyright © 2020-2023  润新知