浅谈JS继承_借用构造函数 & 组合式继承


Posted in Javascript onAugust 16, 2016

2.借用构造函数

为解决原型中包含引用类型值所带来的问题, 我们使用一种叫做 借用构造函数(constructor stealing)的技术(又叫伪造对象或经典继承)。

这种技术的基本思想:在子类构造函数内部调用超类型构造函数。

通过使用apply()和call()方法可以在新创建的子类对象上执行构造函数。

function SuperType(){
  this.colors = ["red", "blue", "green"];
}

function SubType(){
  //继承了 SuperType
  SuperType.apply(this);
}

var instance1 = new SubType();
instance1.colors.push("black");
alert(instance1.colors);  //red,blue,green,black

var instance2 = new SubType();
alert(instance2.colors);  //red,blue,green

在上述例子中,实际上是在新创建的SubType实例(instance1 instance2)的环境下调用了SuperType的构造函数。这样一来,就会在新SubType对象上执行SuperType()函数中定义的所有对象初始化代码。 所以Subtype的每个实例就都会具有自己的colors属性的副本了。

传递参数

对于原型链来讲,借用构造函数有一个很大的优势,即可以在子类型构造函数中想超类型构造函数传递参数。

function SuperType(name){
  this.name = name;
}

function SubType(){
  SuperType.call(this, "Bob");
  this.age = 18;
}

var instance1 = new SubType();
alert(instance1.age);  //18
alert(instance1.name);  //Bob

借用构造函数的问题:

方法都在构造函数中定义,因此函数复用就无从谈起了。而且,在超类型的原型中定义的方法,对子类型而言也是不可见的。

3. 组合继承

组合继承(combination inheritance), 有时候也叫作伪经典继承, 指的是将原型链和借用构造函数的技术组合到一起。从而发挥二者之长的一种继承模式。

使用原型链实现对原型属性和方法的继承;

通过借用构造函数来实现对实例属性的继承。

这样,既通过在原型上定义方法实现了函数的复用,又能保证每个实例都有他自己的属性。

function SuperType(name){
  this.name = name;
  this.colors = ["red", "blue", "green"];
}
SuperType.prototype.sayName = function(){
  alert(this.name);
}

function SubType(name, age){

//继承属性
  SuperType.call(this, name);
  this.age = age;
}


//继承方法
SubType.prototype = new SuperType();
SubType.prototype.sayAge = function(){
  alert(this.age);
}

var instance1 = new SubType("Bob", 22);
instance1.colors.push("black");
alert(instance1.colors);   //red,blue,green,black
instance1.sayName();     //Bob
instance1.sayAge();     //22

var instance2 = new SubType("Alice", 21);
alert(instance2.colors);  //red,blue,green
instance2.sayName();    //Alice
instance2.sayAge();     //21

在这个例子中, SuperType构造函数定义了两个属性: name和colors。 SuperType的原型定义了一个方法sayName()。

SubType构造函数在调用SuperType构造函数时传入了name参数,定义了他自己的属性age。然后将SuperType的实例赋值给SubType的原型。在该原型上定义了方法sayAge()。

这样一来,就可以让两个不同的SubType实例既分别拥有自己的属性 - 包括colors属性,又可以使用相同的方法。

以上这篇浅谈JS继承_借用构造函数 & 组合式继承就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
在b/s开发中经常用到的javaScript技术
Aug 23 Javascript
jQuery事件用法实例汇总
Aug 29 Javascript
javascript制作的cookie封装及使用指南
Jan 02 Javascript
15款jQuery分布引导插件分享
Feb 04 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
Aug 16 Javascript
基于bootstrap风格的弹框插件
Dec 28 Javascript
javascript数据结构中栈的应用之符号平衡问题
Apr 11 Javascript
Bootstrap实现下拉菜单多级联动
Nov 23 Javascript
详解Vue结合后台的列表增删改案例
Aug 21 Javascript
ztree加载完成后显示勾选节点的实现代码
Oct 22 Javascript
原生js拖拽实现图形伸缩效果
Feb 10 Javascript
三步搞定:Vue.js调用Android原生操作
Sep 07 Javascript
JS读写CSS样式的方法汇总
Aug 16 #Javascript
浅谈JS继承_寄生式继承 & 寄生组合式继承
Aug 16 #Javascript
jQuery EasyUI Tab 选项卡问题小结
Aug 16 #Javascript
jQuery3.0中的buildFragment私有函数详解
Aug 16 #Javascript
js 自带的 map() 方法全面了解
Aug 16 #Javascript
JavaScript实战之带收放动画效果的导航菜单
Aug 16 #Javascript
js 自带的sort() 方法全面了解
Aug 16 #Javascript
You might like
php中处理模拟rewrite 效果
2006/12/09 PHP
UCenter Home二次开发指南
2009/05/28 PHP
php中实现可以返回多个值的函数实例
2015/03/21 PHP
深入探究PHP的多进程编程方法
2015/08/18 PHP
WordPress主题制作之模板文件的引入方法
2015/12/28 PHP
PHP单态模式简单用法示例
2016/11/16 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
2017/02/15 PHP
jquery中获得$.ajax()事件返回的值并添加事件的方法
2010/04/15 Javascript
JS异常处理的一个想法(sofish)
2013/03/14 Javascript
js判断字符是否是汉字的两种方法小结
2014/01/03 Javascript
JQuery中ajax方法访问web服务实例
2015/07/18 Javascript
jQuery实现的手机发送验证码倒计时效果代码分享
2015/08/24 Javascript
Vue 2.x教程之基础API
2017/03/06 Javascript
为JQuery EasyUI 表单组件增加焦点切换功能的方法
2017/04/13 jQuery
jQuery获取table表中的td标签(实例讲解)
2017/07/28 jQuery
JavaScript中Require调用js的实例分享
2017/10/27 Javascript
使用Angular 6创建各种动画效果的方法
2018/10/10 Javascript
Vue-cli3.x + axios 跨域方案踩坑指北
2019/07/04 Javascript
nodejs语言实现验证码生成功能的示例代码
2019/10/13 NodeJs
Python及Django框架生成二维码的方法分析
2018/01/31 Python
在python带权重的列表中随机取值的方法
2019/01/23 Python
python的pstuil模块使用方法总结
2019/07/26 Python
Pycharm pyuic5实现将ui文件转为py文件,让UI界面成功显示
2020/04/08 Python
Python通过两个dataframe用for循环求笛卡尔积
2020/04/29 Python
Python实现七个基本算法的实例代码
2020/10/08 Python
使用CSS3代码绘制可爱的Hello Kitty猫
2016/08/03 HTML / CSS
HTML5 Web 存储详解
2016/09/16 HTML / CSS
全球领先的鞋类零售商:The Walking Company
2016/07/21 全球购物
Tretorn美国官网:瑞典外套和鞋类品牌,抵御风雨
2018/07/19 全球购物
美国迪克体育用品商店:DICK’S Sporting Goods
2018/07/24 全球购物
周生生珠宝香港官网:Chow Sang Sang(香港及海外配送)
2019/09/05 全球购物
中专毕业生自荐信
2013/11/16 职场文书
仓库主管的岗位职责
2013/12/04 职场文书
寄语学生的话
2014/04/10 职场文书
公安局负责人查摆问题及整改方案
2014/09/27 职场文书
班主任培训研修日志
2015/11/13 职场文书