zoukankan      html  css  js  c++  java
  • JS-面向对象-继承

    --参看文献;

    --http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.html

        比如,现在有一个"动物"对象的构造函数。


      function Animal(){

        this.species = "动物";

      }

        

      还有一个"猫"对象的构造函数。


      function Cat(name,color){

        this.name = name;

        this.color = color;

      }

      怎样才能使"猫"继承"动物"呢?

      一:构造函数绑定;

         使用 call 或者 apply方法;将父对象的构造函数绑定在子对象上;

         

        子对象构造函数中加一行:

      function Cat(name,color){

        Animal.apply(this, arguments);

        this.name = name;

        this.color = color;

      }

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

      alert(cat1.species); // 动物

    二、 prototype模式

     如果猫的prototype对象,指向一个animal实例,那么所有猫的实例,就能继承animal 了;

     Cat.prototype=new Animal();

     Cat.prototype.constructor=Cat;

     var c=new Cat("小猫",“黑色”)

     alert(c.species)

     

    注意,解析:

      cat 的prototype 对象指向了一个animal实例;它相当于完全删除了原先的值;然后赋值给一个新的值

      原来任何一个prototype对象都有一个constructor属性,指向它的构造函数;

      有"Cat.prototype = new Animal();"这一行,Cat.prototype.constructor是指向Cat的;加了这一行以后,Cat.prototype.constructor指向   Animal。

      更重要的是,每一个实例也有一个constructor属性,默认调用prototype对象的constructor属性。

      这显然会导致继承链的紊乱

    这是很重要的一点,编程时务必要遵守。下文都遵循这一点,即如果替换了prototype对象,

      o.prototype = {};

    那么,下一步必然是为新的prototype对象加上constructor属性,并将这个属性指回原来的构造函数。

      o.prototype.constructor = o;

    三、 直接继承prototype

    四、 利用空对象作为中介

    五、 拷贝继承

    //继续 我们的继承方面的知识;
    function public(){

    }
      public.prototype.publicAction="eat fuck sleep";
      public.prototype.publicTag="people";
      function student(name,age,grade){
      this.name=name;
      this.age=age;
      this.grade=grade;
    }
    //继承机制;
    //prototype 实现继承;
    //avascript规定,每一个构造函数都有一个prototype
    //属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承
    function extend(Child,Parent){
      var F=function (){};
       F.prototype=Parent.prototype;
      Child.prototype=new F();
      Child.prototype.constructor=Child;

    }

    //使用拷贝继承;
    function extend2(Child,Parent){
      var p=Parent.prototype;
      var c=Child.prototype;
      for(var i in p){
      c[i]=p[i];
      }
    }

    function test(){
       extend2(student,public);
       var stu=new student("jack",18,99);
       alert(stu.name);
      alert(stu.publicAction);

    }

    //一些常用的属性和方法;
    //isPrototypeOf();
    //判断某个prototype对象和某个实例之间的关系;
    //个方法用来判断,某个proptotype对象和某个实例之间的关系。
    function show0(){
    var stu=new student("jack",18,90);
    alert(student.isPrototypeOf(stu));// false

    var p=new public();
    alert(public.prototype.isPrototypeOf(p)); //true

    }

    //hasOwnProperty()
    //每个实例都有一个hasOwnPrototype():用来判断属性是属于本地还继承的呀;
    function show8(){
    var stu=new student("jack",19,99);
    alert(stu.hasOwnProperty("publicAction"));
    alert(stu.hasOwnProperty("name"));
    }

    //in 运算符号 用来判断,某个实例是否含有某个属性,不管值本地还是继承的;
    function show12(){
    var stu=new student("jack",19,90);
    alert("name" in stu)
    alert("xx" in stu)
    }
    //还可以用来遍历某个对象的所有属性的呀;
    function show11(){
    var stu=new student("jack",12,12);
    for(var x in stu){
    alert(x); //本地属性;
    }
    }
    function show(){
    // var stu=new student("jack",12,12);
    var p=public.prototype;
    for(var i in p){
    //本地属性;
    alert(i); //指着输出的是字段
    alert(p[i]);//这个输出的字段的内容
    }
    }

  • 相关阅读:
    Docker安装mysql
    解决SpringMVC+Thymeleaf中文乱码
    Web API 自动生成接口文档
    .Net Core 定时任务TimeJob
    使用 FTP 迁移 SQL Server 数据_迁移数据_快速入门(SQL Server)_云数据库 RDS 版-阿里云
    SQLServer · 最佳实践 · 如何将SQL Server 2012降级到2008 R2-博客-云栖社区-阿里云
    PNG文件转png8
    实战ASP.NET访问共享文件夹(含详细操作步骤)
    MVC JsonResult
    你必须知道的EF知识和经验
  • 原文地址:https://www.cnblogs.com/mc67/p/4804051.html
Copyright © 2011-2022 走看看