上节课我们已经了解了prototype
的基本使用:http://blog.csdn.net/github_26672553/article/details/54375735。
本节课,我们来完成对象的继承训练。
上节课课后作业(训练prototype)
var God = new GodClass({
version:’1.0’,
});
在这里我们执行alert(God.version)
请设定一个GodClass.init方法,在该方法中传入参数,后面的任何实例对象不传参数也有version这个属性
var GodClass = function abc(obj){
if(this instanceof abc){
if(obj != undefined){
//把obj中的可枚举属性赋值给this
Object.assign(this,obj); //注意:这个this,必须在你实例化GodClass之后才会产生
}
}else{
alert('不要胡搞');
}
}
var God = new GodClass({version:'1.0'});
alert(God.version); //弹出 '1.0'
上面代码是可以的。
下面我们完成作业,通过一个类似静态函数的方式,修改GodClass
类
var GodClass = function abc(obj){
if(this instanceof abc){
if(obj != undefined){
//把obj中的可枚举属性赋值给this
Object.assign(this,obj); //注意:这个this,必须在你实例化GodClass之后才会产生
}
}else{
alert('不要胡搞');
}
}
//定义一个init方法
GodClass.init = function(obj){
if(obj != undefined){
Object.assign(this.prototype,obj); //注意:这里是把obj对象的属性赋值给了this的prototype
}
}
注意,我们给GodClass
增加了一个init
方法,该方法接收一个对象,我们把对象中的属性赋值给了原型(prototype)上。
以后我们只需要调用一次init
方法后,后面再实例化GodClass就不必传入参数了:
//然后我们可以通过类似静态函数的方法传入参数
GodClass.init({version:'1.0'});
//这里实例化的时候可不传入参数
var God = new GodClass();
alert(God.version); //弹出 '1.0'
这节课我们来训练所谓的对象继承
关键点 Function.prototype.call()
方法在使用一个指定的this值和若干个指定的参数值的前提下调用某个函数或方法
//基类
var BaseNews = function () {
this.display = function(){
alert('新闻基类');
};
}
var SportsNews = function () {
BaseNews.call(this); //这样就继承了BaseNews类中的方法
}
我们使用SportsNews
类:
//实例化
var sn = new SportsNews();
sn.display(); //发现确实存在这个方法
我们还可以通过另外的方式来扩展
除了在SportsNews中,还可以直接在Function
的原型上增加扩展,修改如下:
//基类
var BaseNews = function () {
this.display = function(){
alert('新闻基类');
};
}
//给Function进行扩展
Function.prototype.extends = function (className) {
className.call(this.prototype);
}
//定义SportsNews
var SportsNews = function () {
}
上面代码可以看出,我们给Function.prototype
增加了extends
方法,此方法就是用来扩展类的。
因为增加在原型上所以SportsNews
也有该方法,我们来扩展SportsNews
:
//扩展SportsNews
SportsNews.extends(BaseNews);
//实例化
var sn = new SportsNews();
sn.display(); //发现确实存在这个方法
这个时候,发现实例化后的SportsNews对象,还是有display
方法,因为extends
方法,是call了基类的原型。