`

JavaScript 的继承机制

 
阅读更多
1>  对象冒充,是JavaScript 和 ECMAScript实现继承的方法,在学习对象冒充实现继承前我们的先了解关键字 this 的使用,例如:

        
view plain
function  classA(color){  
  this.color = color;  
  this.show = function(){alert(this.color);}  
}  
/* 
   Note: 
     1> this 代表的是classA函数所构建的对象,而非函数classA对象本身这样说主要是为了避免(function is object)的影响; 
     2> 在构建classA对象时,是通过this来初始化的属性和方法的,如果用classB的this去冒充classA的this,那么就实现了简单的继承了 
*/  



2>继承机制的实现方式:

    NO1:对象冒充

         对象冒充的原理:函数classA通过this来初始化属性和方法,如果用函数classB的this冒充classA的this去执行,则就会使classB具有classA的属性和方法。例如

       
view plain
function classA(sColor){  
   this.sColor = sColor;  
   this.show = function(){alert(this.sColor);}  
}  
  
function classB(sColor,sName){  
  this.new = classA;  
  this.new(sColor);  
  delete this.new;  
  /* 
    Note 
      必须释放classA的引用,那样对于classA是安全的。可是再执行一段以上代码,实现多重继承。 
     this.new = classC; 
    this.new(arguments); 
    delete this.new; 
  */  
  this.sName = sName;   
  this.say = function(){alert(this.sName);}  
}  
  
var a = new classA("blue");  
var b = new classB("red","BMW");  
a.show(); // blue  
b.say(); //BMW  
b.show(); // red  


        注意:对象冒充是所有继承的前提,冒充只能使子类继承基类中的属性和方法,对基类prototype中的属性和方法是不可见的。也可以实现多重继承。

    NO2:原型链

         原型链,是继承的另一种方式,它不是通过对象冒充来实现的,而是改变prototype指针的指向来实现的。不过在运行时也参杂着对象冒充,例如:

       
view plain
function classA(){}  
classA.prototype.sColor = "red";  
classA.prototype.show = function(){  
   alert(this.sColor);  
}  
  
function classB(){}  
classB.prototype = new classA(); //no arguments  
/* 
  Note: 
      classB.prototype 开始指向一块命名空间,执行上行语句后,classB.prototype的命名空间则是classA的以一个对象,所有在执行此方法前不可以向classB增加属性和方法,不然会发生覆盖。 
*/  
classB.prototype.name = "BMW";  
classB.prototype.say = function(){  
 alert(this.name);  
}  
  
var a = new classA();  
a.show(); // red  
var b = new classB();  
b.show(); // red  
b.say(); //BMW  
   

        注意:原型链不可以实现多重继承,且在实例化新的命名空间的时候不可以带参数。



    NO3:call方法

        call(this,argument),此方法是函数对象的方法(classA.call),且两个参数:参数一,this代表的是当前对象;参数二,是实例化的参数,只能是单个的。

      
view plain
function classA(sColor){  
  this.sColor = sColor;  
  this.show = function(){alert(this.sColor);}  
}  
  
classA.prototype.say = function(){  
  alert("hello");  
}  
  
function classB(sColor,sName){  
  classA.call(this,sColor);  
  this.sName = sName;  
  this.showName = function(){  
    alert(this.sName);  
  }  
}  
  
var a = new classA("blue");  
a.show();//blue  
a.say();//hello  
var b = new classB("red","BMW");  
b.show();//red  
b.say();//error : no this function  
b.showName();// BMW  


       注意:之所以会报错主要以因为prototype中的属性和方法通过call方法是继承不下来的,apply方法也一样,唯一的区别就是参数二的类型不同

    NO4:apply方法

        与call方法类似,具体如:

      
view plain
function classA(sColor){  
  this.sColor = sColor;  
  this.show = function(){alert(this.sColor);}  
}  
classA.prototype.say = function(){  
  alert("hello..");  
}  
  
function classB(sColor,sName){  
  classA.apply(this,new Array(sColor));  
  
  this.sName = sName;  
  this.showName = function(){  
    alert(this.sName);  
  }  
}  
  
var a = new classA("blue");  
a.show();// output: blue  
a.say();// output: hello..  
var b = new classB("red","BMW");  
b.show(); //output red  
b.say();// error,no this function  
b.showName();//output BMW  





NO5:原型链 && 对象冒充

      这种模式是原型链和对象冒充的结合,同构对象冒充来继承函数对象中的属性和方法,函数原型中的属性和方法则用原型链来实现。看起来非常清楚,但是值得注意的是,原型链在构建对象时是不带参数的,具体如:

    
view plain
function classA(sColor){  
  this.sColor = sColor;  
  this.show = function(){alert(this.sColor);}  
}  
  
classA.prototype.say = function(){  
  alert("hello ..");  
}  
  
function classB(sColor,sName){  
  classA.call(this,sColor);  
  this.sName = sName;  
}  
  
classB.prototype = new classA();  
//note: no arguments and classB is a classA  
//只有此行后才可以给classB增加自己的属性和方法,否则会发生覆盖  
classB.prototype.showName = function(){  
  alert(this.sName);  
}  
var a = new classA("blue");  
a.show();//output blue  
a.say(); // output hello..  
var b = new classB("red","BMW");  
b.show(); // output red  
b.say(); //output hello..  
b.showName();//output BMW  




总结:通过以上几种方式多可以实现在Javascript中的继承,只有原型链这种方式不然实现多继承,但其优点在于classB的任何对象多属于classA,classB这两个类。
分享到:
评论

相关推荐

    JavaScript继承机制研究.pdf

    JavaScript继承机制研究 在本文中,我们将深入探讨JavaScript继承机制的实现方式,并对基于原型的继承、构造函数方式继承、组合继承、寄生式继承等继承机制进行了总结归纳和分析。 基于原型的继承 JavaScript是...

    JavaScript继承机制探讨及其应用.pdf

    JavaScript继承机制探讨及其应用 JavaScript是一门弱类型语言,具有函数式编程和面向对象编程的特点。随着近几年JavaScript生态圈的发展和成熟,项目的编码量和复杂度也在呈几何级数增长。JavaScript面向对象编程中...

    Javascript 继承机制的实现

    要用ECMAScript实现继承机制,首先从基类入手。所有开发者定义的类都可作为基类。出于安全原因,本地类和宿主类不能作为基类,这样可以防止公用访问编译过的浏览器级的代码,因为这些代码可以被用于恶意攻击。

    Javascript继承机制详解

    学完了Javascript类和对象的创建之后,现在总结一下Javascript继承机制的实现。Javascript并不像Java那样对继承机制有严格明确的定义,它的实现方式正如它的变量的使用方式那样也是十分宽松的,你可以设计自己的方法...

    Javascript 继承机制实例

    在讨论JavaScript继承机制时,我们首先需要了解继承的概念。继承是面向对象编程中的一个核心概念,它允许一个对象(子对象)获得另一个对象(父对象)的属性和方法。通过继承,可以实现代码复用和创建出具有层级关系...

    javascript继承机制实例详解

    在深入探讨JavaScript继承机制之前,我们需要先了解JavaScript中的继承是如何实现的,以及它与传统面向对象语言如ActionScript3中继承的区别。JavaScript是一种基于原型的语言,这意味着它没有像其他语言中的类和...

    Javascript继承机制的设计思想分享

    ### Javascript继承机制的设计思想分享 #### 1. Javascript继承机制简介 Javascript是一种动态类型、解释执行的脚本语言,它不遵循传统的面向对象编程语言中的"类"和"实例"概念。在传统的面向对象编程语言中,类是...

    JavaScript 继承机制的实现(待续)

    ### JavaScript继承机制详解 #### 一、对象冒充方法实现继承 **原理**: JavaScript中的对象冒充是一种实现继承的方式,其核心思想是利用构造函数内部的`this`关键字指向新创建的对象实例,并通过调用另一个构造...

    阿里巴巴技术文章分享 Javascript继承机制的实现

    为了帮助开发者更好地理解JavaScript中的继承机制,阿里巴巴技术团队通过其平台分享了一篇技术文章,详细探讨了如何在JavaScript中实现继承,并且提供了一套实用的解决方案。 在探讨继承之前,文章首先指出了在...

    浅析JavaScript实现基于原型对象的“继承”.pdf

    原型对象是JavaScript继承机制的核心。 寄生组合模式 基于原型的继承有一个缺陷,那就是它不能够很好地支持多继承。如果我们想要实现多继承,我们可以使用寄生组合模式。寄生组合模式是通过组合原型对象和构造函数...

    javascript继承之为什么要继承.docx

    JavaScript 中的继承机制是指子类继承父类的属性和方法,使得子类可以拥有父类的所有特征。继承是面向对象编程的基本机制之一,它可以实现代码复用、提高编程效率和增强代码的可维护性。 在 JavaScript 中,继承是...

    JavaScript继承

    与其他面向对象语言相比,JavaScript的继承机制更为复杂。在Java或C++等语言中,继承通常只需要一个关键字,如`extends`,但在JavaScript中,实现继承需要采用一系列技术。 JavaScript使用的是原型式继承,这是它与...

    由浅入深讲解Javascript继承机制与simple-inheritance源码分析

    Javascript语言对继承实现的并不好,需要工程师自己去实现一套完整的继承机制。下面我们由浅入深的系统掌握使用javascript继承的技巧,对javascript继承相关知识感兴趣的朋友一起看看吧

    浅析javascript原型继承机制

    ### 浅析JavaScript原型继承机制 #### 一、引言 JavaScript作为一种动态语言,其对象模型与传统的面向对象编程语言有所不同。在JavaScript中,并没有直接提供类的概念,而是通过原型来实现继承。本文将深入探讨...

Global site tag (gtag.js) - Google Analytics