prototype继承是通过把子类的原型对象(prototype)设置成父类的一个实例来进行继承的。
只简单的这样设置继承的确如楼主所说,有不少缺点。总的来说有四个缺点:
缺点一:父类的构造函数不是像JAVA中那样在给子类进行实例化时执行的,而是在设置继承的时候执行的,并且只执行一次。这往往不是我们希望的,特别是父类的构造函数中有一些特殊操作的情况下。
缺点二:由于父类的构造函数不是在子类进行实例化时执行,在父类的构造函数中设置的成员变量到了子类中就成了所有实例对象公有的公共变量。由于 JavaScript中继承只发生在“获取”属性的值时,对于属性的值是String,Number和Boolean这些数据本身不能被修改的类型时没有 什么影响。但是Array和Object类型就会有问题。
缺点三:如果父类的构造函数需要参数,我们就没有办法了。
缺点四:子类原本的原型对象被替换了,子类本身的constructor属性就没有了。在类的实例取它的constructor属性时,取得的是从父类中继承的constructor属性,从而constructor的值是父类而不是子类。
我也曾经为了这四个缺点头疼过,于是对prototype继承进行改造。
我试了几种方法,下面是我觉得最好的一种。我把它写成Function对象的一个方法,这样用的时候方便。方法如下:
//类的继承-海浪版
Function.prototype.Extends = function (parentClass)
{
var Bs = new Function();
Bs.prototype = parentClass.prototype;
this.prototype = new Bs();
this.prototype.Super = parentClass;
this.prototype.constructor = this;
}
prototype.js 的实现:
Object.extend=function(destination,source){
for(property in source)
{
destination[property]=source[property];
}
return destination;
}
Object.prototype.extend=function(object){
alert("Object.prototype.extend");
return Object.extend.apply(this,[this,object]);
}
function class1(){
}
class1.prototype={
method:function(){
alert("class1.method!");
},
method2:function(){
alert("class1.method2!");
}
};
function class2(){
}
class2.prototype=(new class1()).extend(
{
method3:function(){
alert("class2.method!");
}
}
);
分享到:
相关推荐
而实例则是类的一个具体实现。 我们还知道,面向对象编程有三个重要的概念 - 封装、继承和多态。 但是在JavaScript的世界中,所有的这一切特性似乎都不存在。 因为JavaScript本身不是面向对象的语言,而是基于对象...
javascript中如何实现封装,继承和多态
详解Javascript继承的实现_.docx
NULL 博文链接:https://raychase.iteye.com/blog/1337415
详细介绍了JavaScript中继承的实现方式以及其优缺点分析。
JavaScript继承的三种方法实例 继承 继承: 首先继承是一种关系,类(class)与类之间的关系,JS中没有类,但是可以通过构造函数模拟类,然后通过原型来实现继承。 继承也是为了数据共享,js中的继承也是为了实现...
NULL 博文链接:https://jiangzhengjun.iteye.com/blog/472212
正因为JavaScript本身没有完整的类和继承的实现,并且我们也看到通过手工实现的方式存在很多问题, 因此对于这个富有挑战性的任务网上已经有很多实现了
【JavaScript的9种继承实现方式归纳】js实现继承的几种方式.pdf
NULL 博文链接:https://yueyemaitian.iteye.com/blog/785325
javascript的继承机制并不是明确规定的,而是通过模仿实现的,意味着继承不是由解释程序处理,开发者有权决定最适合的继承方式.
javascript中如何实现封装,继承和多态,并有详细,我天天在传谢谢
javascript用函数实现继承详解javascript技巧docx.docx
说好的讲解JavaScript继承,可是迟迟到现在讲解。废话不多说,直接进入正题。 既然你想了解继承,证明你对JavaScript面向对象已经有一定的了解,如还有什么不理解的可以参考《面向对象JS基础讲解,工厂模式、构造...
NULL 博文链接:https://snandy.iteye.com/blog/429140
在真正的Web站点和应用程序中,几乎不可能创建名为ClassA和ClassB的类,更可能的是创建表示特定事物(如形状)的类。考虑本章开头所述的形状的例子,Polygon、Triangle和Rectangle类就构成了一组很好的探讨数据。
JavaScript面向对象编程中使用继承,详细讲解四种实现方法的原理。
javaScript面向对象继承方法经典实现.docx
博文链接:https://kuangbaoxu.iteye.com/blog/206450
二、 实现了不同js文件中定义的类的多层继承及封装,使得后续继承或使用(有继承关系的)类时,只需引用类本身的js文件即可,无需考虑实现该类时的继承关系: var Class1=Class(…).from(…); 三、 实现对部分...