douglas crockford在2006年曾提出过javascript正确的原型继承方式:http://javascript.crockford.com/prototypal.html
js本身是基于原型来实现继承的编程语言,而对new这个keywod及其用法的引入,是希望那些习惯了类继承方式的程序员,能够接受js。
而js已经面世很久了,久到大家都在讨论js还能活多久了,,js工程师们也已经理解原型继承是怎么回事了,那么使用new的这个过渡方案还应该被推崇么?
老道07年写了一段js实现原型继承:
Object.prototype.begetObject=function(){functionF(){}F.prototype=this;returnnewF();};newObject=oldObject.begetObject();我个人从审美上认为,老道的这个实现是比下面的方式更优雅也更体现了原型继承的:
functionOldClass(){}functionNewClass(){}NewClass.prototype=newOldClass;newObject=newNewClass();对于原型的“污染”,其实我也可以接受,为什么要用“污染”这种贬义描述,其实是仁者见仁的事情。
假若我们不愿意对Object.prototype原型有所“污染”,那么我们可以定义自己的基本对象:
varcreate=Object.create||function(o){functionF(){}F.prototype=o;returnnewF};BaseObject={create: function(obj){returncreate(this);}};varoldObject=BaseObject.create();oldObject.o=1;varnewObject1=oldObject.create();newObject1.n=1;varnewObject2=oldObject.create();newObject2.n=2;console.log(newObject1,newObject2);这种原型继承,丝毫不拖泥带水,彻底让我们从new这个关键字中解放出来,而且也优雅的维护了javascript继承的原型链,你所需要理解的仅仅是:
每个对象都支持create方法,可以创建一个以自身为原型的新对象,仅此而已。
douglas crockford在2006年曾提出过javascript正确的原型继承方式:http://javascript.crockford.com/prototypal.html
js本身是基于原型来实现继承的编程语言,而对new这个keywod及其用法的引入,是希望那些习惯了类继承方式的程序员,能够接受js。
而js已经面世很久了,久到大家都在讨论js还能活多久了,,js工程师们也已经理解原型继承是怎么回事了,那么使用new的这个过渡方案还应该被推崇么?
老道07年写了一段js实现原型继承:
我个人从审美上认为,老道的这个实现是比下面的方式更优雅也更体现了原型继承的:
对于原型的“污染”,其实我也可以接受,为什么要用“污染”这种贬义描述,其实是仁者见仁的事情。
假若我们不愿意对Object.prototype原型有所“污染”,那么我们可以定义自己的基本对象:
这种原型继承,丝毫不拖泥带水,彻底让我们从new这个关键字中解放出来,而且也优雅的维护了javascript继承的原型链,你所需要理解的仅仅是:
每个对象都支持create方法,可以创建一个以自身为原型的新对象,仅此而已。