上节课我们已经了解了prototype的基本使用:http://blog.csdn.net/github_26672553/article/details/54375735。
本节课,我们来完成对象的继承训练。
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了基类的原型。
