zoukankan      html  css  js  c++  java
  • 类式继承

    学习了几种继承的模式,但是还是对于其实际运用还不是很了解,如有对其比较了解的,希望能够指导指导。

    默认继承

      function Parent(name){
    
        this.name=name||'ad';
    
      }
    
      Parent.prototype.say=function(){
    
        return this.name;
    
      }
    
      function Child(name){}
    
      inherit(Child,Parent);
    
      function inherit(C,P){
    
        C.prototype=new P();//原型属性应该指向一个对象,而不是一个函数因此它必须指向一个由父构造函数所创建的实例(一个对象) 
    
      }

      当使用一个new Child()语句创建一个对象时,它会通过原型从Parent()实例中获取它的对象。

      var kid=new Child();

      kid.say();   //ad 

       在子对象上添加属性后 

      var kid=new Child();

      kid.name='other';

      kid.say();   //other 

    特点或者说是缺点:同时继承 了添加到this的属性和原型上的属性,不支持将参数传递到父构造函数(new Child('anthoer').say();//ad)

    借用构造函数

      function Parent(){
    
        this.name=['html'];
    
      }
    
      var  oParent=new Parent();
    
      function Blog(){}
    
      Blog.prototype=oParent;
    
      var child=new Blog();
    
      function Page(){
    
        Parent.call(this);  
    
      }
    
      var otherChild=new Page();
    
      oParent.hasOwnProperty('name');    //true
    
      child.hasOwnProperty('name');         //false
    
      otherChild.hasOwnProperty('name'); //true
    
      //child对象通过原型获得name属性,并没有将oParent作为自身的属性,所以返回false。
    
         //otherChild对象本身具有一个name属性,因为在借用构造函数的时候,新对象会获得父对象中的tags成员的副本(不是引用)
    
      blog.name.push('css');
    
      otherChild.name.push('php');
    
      alert(oParent.name.join(','));//html,css  由于otherChild.name和oParent.name指向同一个数组。
    
       
    
      function Parent(name){   //父构造函数
    
        this.name=name||'ad';
    
      }
    
      Parent.prototype.say=function(){
    
        return this.name;
    
      }
    
         funcion Child(name){   //子构造函数
    
        Parent.call(this,arguments);
    
      }
    
          var oChild=new Child('bd');
    
          oChild.name;//bd
    
      typeof oChild.say;//undefined
    
     

    优缺点:当使用借用构造函数时可以借用多个构造函数;无法获取原型的属性,   可以获得父对象自身的真实副本,则不会存在子对象意外覆盖父对象属性的风险

    借用和设置原型 

          function Parent(name){   //父构造函数
    
        this.name=name||'ad';
    
      }
    
      Parent.prototype.say=function(){
    
        return this.name;
    
      }
    
         funcion Child(name){   //子构造函数
    
        Parent.call(this,arguments);
    
      }
    
      Child.prototype=new Parent();
    
          var oChild=new Child('bd');
    
          oChild.name;     //bd
          oChild.say();     //bd
    
          delete oChild.name;
    
       oChild.name;     //ad
          oChild.say();     //ad

    优:可以获得父对象本身的成员副本以及指向父对象中可复用功能

    缺:父构造函数被调用两次,自身属性会被继承两次

    共享模型

      function inherit(C,P){
    
        C.prototype=P.Prototype;
      }

    只能继承原型中的属性,所以需要把要继承的东西放在原型中

    优:不涉及任何父构造函数的调用,简短而迅速的原型链查询

    缺:在继承链下方的任何子对象或孙对象都能够修改原型,

    临时构造函数

    function inherit(C,P){
    
      var F=function(){}
    
      F.prototype=P.prototype;
    
      C.prototype=new F();
    
    }

    断开了父对象与子对象的原型之间的直接链接关系,解决了共享模式的子对象修改父对象原型属性的问题,不过也只继承了原型的属性。

      

        

     

  • 相关阅读:
    关于QQ秀
    c#重点知识解答(五) 选择自 masterall 的 Blog
    c#.net常用函数和方法集 选择自 fineflyak 的 Blog
    JavaScript 中 substr 和 substring的区别
    C#重点知识详解(二) 选择自 masterall 的 Blog
    c#重点知识详解(六) 选择自 masterall 的 Blog
    转:一个男孩的自白
    win2003端口映射2003的路由与远程访问,做端口映射(转)
    渗透笔记(转载)
    win下配置的Apache+PHP+MySQL绿色版本(转)
  • 原文地址:https://www.cnblogs.com/CloverH/p/5189036.html
Copyright © 2011-2022 走看看