• 面向对象知识笔记(二)


    /*对象之间继承的五种方法*/
    //如 ,现在又一个“动物"对象的构造函数
    function Animal(){
    this.species = "动物";
    }
    //"猫"对象的构造函数
    function Cat(name,color){
    this.name = name;
    this.color = color;
    }
    //如何才能让“猫”继承“动物”了 下面介绍了五种方法
    /* 1. 使用call或apply方法,将父对象的构造函数绑定在子对象上,即在子对象函数中加一行
    function Cat(name,color){
    Animal.apply(this,arguments);
    this.name = name;
    this.color = color;
    }
    var cat1 = new Cat("大毛","黄色");
    alert(cat1.species); //动物

    */
    /*
    2.prototype模式
    如果“猫”的prototype对象,指向一个Animal的实例,那么所有“猫”的实例,就能继承Animal了
    */

    Cat.prototype = new Animal(); //相当于完全删除了prototype对象原先的值,,然后赋予一个新值
    Cat.prototype.constructor = Cat; //任何一个prototype对象都有一个constructor属性,指向它的构造函数,如果没有"Cat.prototyep=new Animal();"这一行, Cat.Prototype.constructor是指向Cat的;加了这一行以后,Cat.prototype.constructor是指向Cat的,加了这一行以后,Cat.prototype.constructor指向Animal
    var cat1 = new Cat("大毛","黄色");
    // alert(cat1.species); //动物
    alert(Cat.prototype.constructor == Animal); //false
     alert(cat1.constructor == Cat.prototype.constructor);

    /*3.直接继承prototype
    第三种方法是对第二种方法的改进。由于Animal对象中,不变的属性都可以直接写入Animal.prototype,所以,我们也可以让Cat()跳过Animal(),直接继承Animal.prototype
    function Animal(){}

    Animal.prototype.species = "动物";


    //然后,将Cat的prototype对象指向Animal的prototype的对象,这样就完成了继承

    Cat.prototype = Animal.prototype;
    Cat.prototype.constructor = Cat;
    var cat1 = new Cat("大毛","黄色");
    alert(cat1.species);//动物
    //与前一种方法相比,这样做的有点就是效率比较高(不用执行和建立Animal的实例了),比较省内存.缺点是Cat.prototype和Animal.prototype现在指向了同一个对象,那么任何对Cat.prototype的修改,都会反映到Animal.prototype,所以,上面这一段代码其实是有问题的.请看第二行 Cat.prototype.constructor = Cat;这一句实际上把Animal.prototype对象的constructor属性也改掉了
    */


    /*4利用空对象作为中介
    由于直接继承prototype存在上述的缺点,所以就有第四种方法,利用一个空对象作为中介。

    var F = function(){};
    F.prototype = Animal.prototype;
    Cat.prototype = new F();
    Cat.prototype.constructor = Cat;
    //F是空对象,所以几乎不占内存,这时,修改Cat的prototype对象,就不会影响到Animal的prototype对象.

    alert(Animal.prototype.constructor);//Animal

    //将上面的方法,封装成一个函数,便于使用
    function extend(Child,Parent){
    var F = function(){};
    F.prototype = Parent.prototype;
    Child.prototype=new F();
    Child.prototype.constructor=Child;
    Child.uber = Parent.prototype;
    }
    //使用方法如下
    extend(Cat,Animal);
    var cat1 = new Cat("大毛","黄色");
    alert(cat1.species);//动物
    */
    /*5.拷贝继承
    上面是采用prototype对象,实现继承。我们也可以换一种思路,纯粹采用“拷贝”方法实现继承,简单说,如果把父对象的所有属性和方法,拷贝进子对象,不也能够实现继承码,这样我们就有了第五种方法
    */
    //首先,还是把Animal的所有不变属性,都放到他的prototype对象上.
    function Animal(){}
    Animal.prototype.species= "动物";

    function extend2(Child,Parent){
    var p = Parent.prototype;
    var c = Child.prototype;

    for(var i in p){
    c[i] = p[i];
    }
    c.uber = p;
    }
    //使用的时候,这样写:

      extend2(Cat, Animal);

      var cat1 = new Cat("大毛","黄色");

      alert(cat1.species); // 动物

  • 相关阅读:
    POJ 1182 食物链
    HDU 1385 Minimum Transport Cost
    HDU_2544 最短路
    HDU 2066 一个人的旅行
    poj3090
    poj3157
    poj3169
    poj3125
    poj3187
    VMware Workstation 8的简明使用教程
  • 原文地址:https://www.cnblogs.com/h5it/p/9244075.html
Copyright © 2020-2023  润新知