• 关于js继承学习系列之二:原型链(Prototype Chaining)[转]


        原型链是采用的最主要的继承方式,它的思路是这样的:每一个类(构造器,js中的function)都有一个原型属性(prototype)指向原型对 象,原型对象有一个构造器属性(constructor),它又指回到function,是个循环引用。类的每个实例,也有个原型属性(代码无法访问的, 叫做__proto__),它跟构造器原型发生指向的是同一个对象,即同一个类的所有实例共用一个原型对象。要实现两个类型的继承,就是将一个类型的原型 对象指向另一个类型的实例,而不在是原来的默认的原型对象。这样就形成了原型链。
        子类可以通过原型链获得超类的所有属性和方法。从而实现了继承。基本的js代码如下:

     1 //supper class
    2 function BaseClass()
    3 {
    4 this.baseName="BaseClass";
    5 }
    6 BaseClass.prototype.getBaseClassName = function(){return this.baseName;}
    7 //child class
    8 function ChildClass
    9 {
    10 this.childName="ChildClass";
    11 }
    12 //make prototype chaining, inherit
    13 ChildClass.prototype = new BaseClass();
    14
    15 ChildClass.prototype.getChildClassName = function(){return this.childName;}
    16
    17 var instance = new ChildClass();
    18 alert(instance.getBaseClassName ());//BaseClass


          ChildClass(及它的实例)的prototype(__proto__)属性不再指向默认的prototype对象,而是BaseClass的 实例,这个实例也有个属性(__proto__),它指向的是BaseClass的原型对象。在ChildClass的实例instance上查找 baseName属性的过程是这样的:首先,在实例instance自身上找baseName属性,没有找到,则在它的原型对象(__proto__属 性,此时是BaseClass的实例,不在是默认的原型对象)上查找,并找到baseName属性,返回它的值;而getBaseClassName() 方法的查找,首先是在instance自身上,但并没找到,然后进入的它的原型对象(__proto__属性,此时是BaseClass的实例,不在是默 认的原型对象)上,依然没找到,则进入这个BaseClass的实例的原型对象(__proto__属性,默认的原型对象)上找,终于找到,则返回这个方 法的执行结果。
        像文中强调的那样,类型的原型对象是其所有实例所共有的,这就造成了这样一个问题:原型对象(父类实例)的属性及方法的改变将影响到所有实例,无论是已经创建的还是即将创建的。分析以下代码:

     1 function BaseClass()
    2 {
    3 this.colors = ["red","blue"];
    4 }
    5 function ChildClass()
    6 {
    7 }
    8 ChildClass.prototype = new BaseClass();
    9
    10 var instance1 = new ChildClass();
    11
    12 //在此实例上对从父类继承过的属性值进行了修改。
    13 var instance2 = new ChildClass();
    14 instance2.colors.push("green");
    15
    16 var instance3 = new ChildClass();
    17
    18 ///查看各个实例的colors属性值
    19 alert(instance1.colors);//red,blue,green
    20 alert(instance2.colors);//red,blue,green
    21 alert(instance3.colors);//red,blue,green


    可见对于任一个实例来讲,如果修改了它继承的属性值,则将影响到其他任何时候创建的实例。
        另外,如果继承的层次过多,则对最顶层父类中的属性、方法的调用效率最低(推测,没有证实)。

    转自:http://babyhey.com/forum.php?mod=viewthread&tid=1160&extra=page%3D2

  • 相关阅读:
    HDU
    2019CCPC秦皇岛自我反省&部分题解
    图论之二分图相关内容
    图论之一般图相关内容
    2019 南昌ICPC网络赛H The Nth Item
    HDU 5486 Difference of Clustering 暴力模拟
    图论之tarjan真乃神人也,强连通分量,割点,桥,双连通他都会
    数论之二次剩余
    没有哈密瓜只有哈密顿----图论之哈密顿回路
    面试题整理:C#(二)
  • 原文地址:https://www.cnblogs.com/405464904/p/2179577.html
Copyright © 2020-2023  润新知