标签:
我想我的JavaScript的基本语法基础掌握的差不多了,现在没时间,毕竟那么多考试等着我。等到寒假我就把犀牛书过一遍。
本来就有那么多考试,但是我还是忍不住写点JavaScript的代码。我认为我的基础差不多了,我就把那本《JavaScript设计模式》拿出来看,我之前是看不懂的。
然后我想我现在应该看得懂了吧。就特意找了继承这一章看一看。
——————————————————————我是厉害的分割线————————————————————————————————————————
只能说勉强能看懂。
后来结合阮一峰的关于继承的博客懂了不少,我发现这本书真是好东西。
虽然前辈说的已经很棒了,但是这本书说了前辈没说的,当然前辈也说了这本书没说的,当然我估计JS还有别的继承方式,在这就不列举了。
——————————————————————我是厉害的分割线————————————————————————————————————————
总结一下几种继承方式
一、类式继承(来自书中翻译)
用call或者apply函数来继承方法。
引用前辈的例子:
function Animal(){ this.species = "动物"; } function Cat(name,color){ this.name = name; this.color = color; } function Cat(name,color){ Animal.apply(this, arguments); this.name = name; this.color = color; } var cat1 = new Cat("大毛","黄色"); alert(cat1.species); //动物 by:阮一峰
然后继承prototype的属性
Cat.prototype = new Animal(); Cat.prototype.constructor = Cat; var cat1 = new Cat("大毛","黄色"); alert(cat1.species); // 动物 by:阮一峰
为什么不直接赋值呢,因为是引用,改变子类的prototype会改变父类的prototype。
不过这样实例Anima对象,在这里没问题,但是如果实例的对象很大,就有点得不偿失。
就引进了新的方法。
用一个新对象来过渡,代码如下:
var F = function(){}; F.prototype = Animal.prototype; Cat.prototype = new F(); Cat.prototype.constructor = Cat;// by:阮一峰
然后前辈把它变成了一个函数,我之前就在书上看到了。我觉得书上写的更好
function extend(subClass,superClass){ var F=function(){}; F.prototype=superClass.prototype; subClass.prototype=new F(); subClass.prototype.constructor=subClass; //第二段 subClass.superclass=superClass.prototype; //1 if(superClass.prototype.constructor==Object.prototype.constructor){ superClass.prototype.constructor=superClass; } }
然后我没看懂第二段是什么意思,书上说的太抽象,后来我看了前辈的博客又看了一遍书,看懂了。
是为了弱化子类和父类的耦合,同时确保constructor对应正确的位置,在书的p43,我往前看了看发现每个继承只要prototype变了,constructor就要设置一下。
我查了相关资料这个属性到底有什么用。见文章底。我们继续说继承。
这种类式继承说完了,我们来说说原型式继承。
//原型式继承测试 var Person={ name:‘test‘, getName:function(){ return this.name; } } var a1=clone(Person); alert(a1.getName()); a1.name=‘love~‘; alert(a1.getName());
这个clone函数是什么了
function clone(object){ function F(){}; F.prototype=object; return new F(); }
就是创建了一个空对象,把空对象的prototype引向父类。
返回一个实例的对象,然后测试的时候是把a1对象赋值为返回的对象F。
看完真的好佩服前人的智慧。
前辈博客还有好几个别的方式,浅拷贝,深拷贝,以前看过类似的在这里就不在多说了,可以到前辈的博客里自己看。
——————————————————————我是厉害的分割线————————————————————————————————————————
最后说说constructor的作用。
var a,b; (function(){ function A (arg1,arg2) { this.a = 1; this.b=2; } A.prototype.log = function () { console.log(this.a); } a = new A(); b = new A(); })() a.log(); // 1 b.log(); // 1
a.constructor.prototype.log2 = function () { console.log(this.b) } a.log2(); // 2 b.log2(); // 2
然后后面涉及到正则,我要抽时间好好看看,写个博客。
——————————————————————我是厉害的分割线————————————————————————————————————————
最后,《JavaScript设计模式》这本书真的是好书。前辈的博客是好东西,知乎是好东西,谷歌是好东西……
标签:
原文地址:http://www.cnblogs.com/growlove/p/5037762.html