对象继承训练(2):继承后可以调用父类方法
来源:互联网 发布:linux hadoop 下载 编辑:程序博客网 时间:2024/06/05 21:57
上节课(http://blog.csdn.net/github_26672553/article/details/54890416),我们做了一个js的简单的继承。
所谓的继承
1、js中并没有类似java或者php一样的类继承
2、仅仅是通过一些『模拟方法』使得看起来好像是继承。因此方法很多,大家可以百度一下。
3、今天我们要实现的是,怎么让子类可以调用父类的方法?
回顾
上节课我们的简单的『继承』 父类
:
//基类var BaseNews = function () { this.display = function(){ alert('新闻基类'); };}
父类有用一个display
方法。
然后我们在Function
的prototype
上定义了一个名为extends
的方法,此方法用来实现所谓的继承。
//给Function进行扩展Function.prototype.extends = function (className) { className.call(this.prototype); //this 指向实例化过后的对象}
子类SportsNews
:
var SportsNews = function () { //有自己的属性 this.version = '1.0';}
注意:此时SportsNews
还不是BaseNews
的子类,还没有继承父类BaseNews
。
下面代理来实现所谓的继承:
//扩展SportsNews,实现所谓的继承SportsNews.extends(BaseNews);
因为我们给Function
的原型上添加了extends
方法,SportsNews也是Function
,所以可以调用extends
方法,然后传入BaseNews
类,就实现了继承BaseNews类。
我们实例化SportsNews后,发现该类也有了父类BaseNews的display方法
//实例化var sn = new SportsNews();sn.display(); //发现确实存在这个方法
继承后可以调用父类的方法
如果我们的子类SportsNews类,也有一个display方法
var SportsNews = function () { //有自己的属性 this.version = '1.0'; this.display = function(){ alert('体育新闻'); };}
那么实例化SportsNews
类后调用display
放就是自己的,而不是父类BaseNews的。
var sn = new SportsNews();sn.display(); //弹出:'体育新闻'
实现我们今天的需求
//给Function进行扩展Function.prototype.extends = function (className) { className.call(this.prototype); //this 指向实例化过后的对象 //给实例化后的对象的原型上增加一个father对象 //该对象是父类实例化后的对象 //所以 xxx.father就是BaseNews类实例化后的对象 this.prototype.father = new className();}
注意:我们在extends
方法中给this(实例化后的对象,比如sn)
的原型(prototype)
上添加的一个属性father
,这个father
就是extends()
传入的类的实例化对象(也就是父类new出来的对象)。
所以,在子类SportsNews调用extends()
继承了父类BaseNews后,子类实例化后的对象就有了father
,也就有了父类中的方法。
//扩展SportsNews,实现所谓的继承SportsNews.extends(BaseNews);//实例化var sn = new SportsNews();sn.father.display(); //弹出:'新闻基类'
到这里,其实我们已经实现了继承后的子类可以调用父类的方法了。
但是,还有一个小问题,比如
//基类var BaseNews = function () { alert('父类实例化'); this.display = function(){ alert('新闻基类'); };}
在子类对象调用父类的方法的时候,alert('父类实例化')
会执行2次,相当于初始化了2次父类。我们要稍作修改:
//基类var BaseNews = function bb() { if (this instanceof bb){ alert('父类实例化'); } this.display = function(){ alert('新闻基类'); };}
这样alert('父类实例化');
只会执行一次了。
- 对象继承训练(2):继承后可以调用父类方法
- 对象继承训练(1)
- OC中继承子类对象调用方法机制 子类对象访问父类中的实例变量
- OC中继承子类对象调用方法机制 子类对象访问父类中的实例变量
- Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)
- 【Java笔记】继承父类的方法可以调用子类的方法(子类必须在重写相应方法)
- 《C++面向对象》在C++中子类继承和调用父类的构造函数方法
- 继承方法调用问题
- java继承方法调用
- JavaScript对象继承方法
- JS对象继承方法
- 继承训练
- java中子类继承父类调用利用继承方法时调用this
- C++中继承和调用父类的构造函数方法,外加MFC常见dialog继承
- 继承父类,调用父类中的方法
- 子类继承和调用父类的构造方法
- 子类继承和调用父类的构造方法
- 子类继承和调用父类的构造方法
- 03-S3C2440u-boot学习之u-boot分析之u-boot命令实现
- 关于localtime()函数在多线程中的core问题
- C实例---文件操作(打开文件)
- JAVA jsoup 架包安装
- 后缀数组模板
- 对象继承训练(2):继承后可以调用父类方法
- .Net程序员学用Oracle系列(11):系统函数(下)
- POJ1182【种类并查集】
- 《程序员自我修养》--动态链接
- 在win7上安装ft232r usb uart 驱动
- Java容器(五):LinkedHashMap实现原理
- IOS网络问题
- Git学习使用(四):远程仓库
- redis源码分析(三)-ziplist的实现