javascript继承一般有三种模式:组合继承,原型式继承和寄生式继承;

1组合继承:javascript最为广泛的继承方式通过原型链实现对原型属性和方法的继承,通过构造函数实现对实例属性的继承,同时发挥两者的优越性。

<script>
function supertype(name){//父类型的构造函数
        	this.name=name;
        	this.colors=["blue","yellow","red"];
        }
        supertype.prototype.sayname=function(){//父类型的原型
        	alert(this.name);
        }
        function subtype(name){
        	   supertype.call(this,name);//通过call函数实现了向父类型的构造函数中传参
        	   this.age=13;
        }
        subtype.prototype=new supertype();//通过原型链继承了supertype实例中的所有属性和方法
        var instance1=new subtype("彭湖湾");

        alert(instance1.name);//输出彭湖湾
        instance1.colors.push("black");
        alert(instance1.colors);//输出为blue,yellow,red,black

        var instance2=new subtype("小明");
        alert(instance2.name);//输出为小明
        alert(instance2.colors);//输出为blue,yellow,red
</script>

  

在组合继承的过程中,首先调用了call()函数继承了父类型的构造函数的所有属性(又叫做伪继承),这样做有两个好处

1:克服了纯粹只使用原型链继承不能直接传参的缺陷,比如上面subtype继承supertype后能够在创建实例时传入自己的name参数,如果单纯使用原型式继承则不能做到这一点。

2:如果只使用原型链进行继承,实例中的引用类型的属性比如Array,Date,Function等属性是共用的,使用时将非常麻烦。但组合继承中由于通过call()方法继承了父类型的构造函数,新添加的属性将覆盖掉原本共用的引用类型属性。举个例子,在上面的代码中instance1.colors和instance2.colors输出分别为blue,yellow,red,black和blue,yellow,red,在两个实例中colors数组属性是相互独立的,但如果去掉

supertype.call(this,name);//通过call函数实现了向父类型的构造函数中传参
this.age=13;

这一段代码的话,实例的colors属性的输出结果将变成:

        instance1.colors.push("black");
        alert(instance1.colors);//输出为blue,yellow,red,black

        var instance2=new subtype("小明");
        alert(instance2.colors);//输出为blue,yellow,red,black

  

instance1对colors数组属性添加“Black”的操作同时对instance2的的属性造成了影响,这表明,如果只使用原型链继承的话,colors属性是子类型的实例所共用的

二:原型式继承:仅借助原型基于已有的对象创建新的副本对象

<script>
function object(o){//o为一个以对象字面量形式定义的对象
        function new_object(){};//通过构造函数形式创建一个新对象
        new_object.prototype=o;//使新对象的原型等于传入的对象
        return new new_object();//返回新对象的实例
   }
   var person={//创建一个person对象
       name:"彭湖湾",
       age:,
       friends:["a","b","c"]
   };
   var person1=object(person);//根据person对象创建一个实例person1
   person1.name="小明";
   person1.friends.push("d");
   alert(person1.name);//输出为小明
   alert(person1.friends);//输出为a,b,c,d
   var person2=object(person);//根据person对象创建一个实例person2
   alert(person2.name);//输出为彭湖湾
   alert(person2.friends);//输出为a,b,c,d
</script>

基本的思想和工厂模式相类似,声明一个以一个字面量对象为参数的函数,并将其作为新对象的原型,最后将新对象的实例返回

原型式继承的优点:能实现函数复用,能创建大量相似的对象

原型式继承的缺点:正如上文所说:在原型式继承中,在创建子类型实例时,子类型实例的基本类型属性(如boolean,number,string)可以分别指定不同的新值,但引用类型(Array,Date,Function,Object)的属性则在各个子类型实例中是共享的

三.寄生式继承:和原型式继承类似,但在函数内部通过某些方式来增强对象:

<script>
unction createanother(o){
         var new_object=Object(o);//通过调用函数复制一个副本对象
         new_object.sayhi=function(){//以某种方式来增强这个对象
             alert("hi");
         }
         return new_object;//返回该副本对象
     }
     var person={//创建一个person对象
         job:"student"
     }
     var person2=createanother(person);
     person2.sayhi();
</script>

最新文章

  1. WebApp 九宫格抽奖简易demo
  2. iOS - Localizable 国际化
  3. NPOI Excel 单元格背景颜色对照表
  4. 使用Javascript实现返回顶部功能。
  5. iOS 关于AFNetworking ssl 待完成
  6. (转) Lua使用心得一 LUA和VC整合
  7. mysqld参数配置
  8. C#上位机读数据库
  9. 3DTouch-ShortcutItem - iOS9 - xcode7
  10. python基础知识(引用)
  11. datagrid公用字段扩展
  12. 定义 ICache 接口,以及实现默认的 ASP.NET 缓存机制
  13. html中怎么设置性别默认选择
  14. 28. SpringBoot 集成Redis
  15. jdbc问题:Access denied for user &#39;&#39;@&#39;localhost&#39;&#39;是因为没输入账户和密码
  16. 云硬盘性能测试工具FIO介绍
  17. 【java】函数重载
  18. Driver stacktrace: at org.apache.spark.scheduler.DAGScheduler.org$apache$spark$scheduler$DAGSchedul
  19. 使用注解配置 AOP
  20. 20155316 《网络对抗》Exp8 Web基础

热门文章

  1. “RazorEngine.Templating.TemplateParsingException”类型的异常在 RazorEngine.NET4.0.dll 中发生,但未在用户代码中进行处理 其他信息: Expected model identifier.
  2. Dedecms有效防止采集的两个实用办法
  3. Orcle基本语句(六)
  4. unity安卓和IOS读写目录
  5. 10月16日下午MySQL数据库CRUD操作(增加、删除、修改、查询)
  6. Understanding mysql max_connect_errors
  7. Text3d
  8. Grid画边框
  9. sql server R2 下载地址收藏
  10. js鼠标事件
  11. dos 命令集
  12. 【Vue 2.x】计算属性
  13. centos7开启80和8080端口
  14. Validation.Add();Excel
  15. CSS3实现背景透明文字不透明
  16. 关于安装 rst2pdf 时遇到的 setuptools过老的问题
  17. [转载]ViewPort &lt;meta&gt;标记
  18. jquery mobile两个页面以及源码(登录与注册) 转
  19. @Html.Raw() 与Newtonsoft.Json.JsonConvert.SerializeObject()
  20. JAX_WS 2.2 规范的webservices客户端实现(Axis2,Cxf)