`
haiyang
  • 浏览: 70306 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

js 继承总结(收藏)

阅读更多

每当我们说到js的继承时,在您的脑袋的第一反应就是prototype原型机制来实现。但是您是否使用过其他的方法来实现继承呢,或者您是否了解其他实现方式及各种不同的继承实现机制的优缺点呢?

好了,下面我们就来看看几种比较常见的继承实现吧。

1、 prototype方式

 1
js 代码
  1.   

这种方式最为简单,只需要让一个类的prototype为被继承的一个实例就ok,然后直接使用BaseClass的方法。

       prototype属性是啥意思呢?prototype即为原型,每一个对象(function 定义出来)都有一个默认的原型属性,该属性是个对象类型。并且该默认属性用来实现链的向上攀查。意思就是说,如果某个对象的属性不存在,那个将通过prototype属性对应的对象的来查找该对象的属性。如果prototype查找不到呢? js会自动地找prototypeprototype属性对应的对象来查找,这样就通过prototype一直往上索引攀查,直到查找到了该属性或者prototype最后为空("undefined");

       例如:上例中的instance.ToString()方法。js会先在instance实例中查找是否有ToString()方法,因为没有,所以查找Derived.prototype属性,prototype NewClass的一个实例,该实例有ToString()方法,于是调用成功;同样给instance name 属性赋值时也是查找prototype来实现的。

       注意,每一个对象得prototype都默认对应一个object对象,但是该对象不等于Object;如何验证呢?看如下代码:

1       var foo = function(){};
2
3       var result = (foo.prototype==Object);

这段代码的result 所得值为 false;

以下几个需要注意:

 1    typeof(Object.prototype) == "object";
 2
 3 
 4
 5       typeof(Object.prototype.prototype) == "undefined";
 6
 7 
 8
 9       var obj = new Object();
10
11       typeof(obj.prototype) == "undefined";
12
13       
14
15       var obj = {};
16
17       typeof(obj.prototype) == "undefined";
18
19 
20
21

2apply方式

 1var BaseClass =function()
 2
 3{
 4
 5    this.name = "3zfp";
 6
 7    this.age = 100;
 8
 9    this.ToString = function(){
10
11        return this.name+" " +this.age;
12
13    }

14
15}

16
17var Derived = function()
18
19
20
21       BaseClass.apply(this,new Array());
22
23    this.address = "ShenZhen";
24
25}

26
27var instance = new Derived();
28
29instance.ToString();
30
31 
32

在这种方式下,我们最需要理解的就是apply函数的作用。

该方法普遍的解释为用A方法去替换B方法。第一个参数为B方法的对象本身,第二个参数为一个数组,该数组内的值集合为需要传递给A方法对应的参数列表,如果参数为空,即没有参数传递,则通过 new Array() 来传递,null无效。

一般的方式为:

但是在本例当中,apply方法执行了两步操作。

 第一:将BaseClassapply传递的Array数组作为初始化参数进行实例化。

第二:将新生成的实例对象的所有属性(nameageToString方法)复制到 instance实例对象。这样就实现了继承。

 1var foo = function()
 2
 3{
 4
 5       this.fooA = function(){
 6
 7              this.fooB.apply(this,new Array("sorry"));
 8
 9       }

10
11       this.fooB =function(str)
12
13       {
14
15              alert(str);
16
17       }

18
19}

20
21new foo().fooA();
22

 3call+prototype 方式

 1var BaseClass =function(name,age)
 2
 3{
 4
 5    this.name = name;
 6
 7    this.age = age;
 8
 9    this.ToString = function(){
10
11        return this.name+" " +this.age;
12
13    }

14
15}

16
17var Derived = function()
18
19
20
21       BaseClass.call(this,"3zfp",100);
22
23    this.address = "ShenZhen";
24
25}

26
27Derived.prototype = new BaseClass();
28
29var instance = new Derived();
30
31instance.ToString();
32
33

       其实,call函数和apply方式有很类似的作用,都是用A方法去替换B方法,但是参数传递不一样,call方法的第一个参数为B方法的对象本身,和面的参数列不用Array对象包装,直接依次传递就可以。

      为什么作用类似,call方式的实现机制却要多一条 Derived.prototype = new BaseClass(); 语句呢?那是因为call方法只实现了方法的替换而没有作对象属性的复制操作。

call方法实际上是做了如下几个操作:

例:

 1var foo = function()
 2
 3{
 4
 5       this.fooA = function(){
 6
 7              this.fooB.call(this,"sorry");
 8
 9       }

10
11       this.fooB =function(str)
12
13       {
14
15              alert(str);
16
17       }

18
19}

20
21new foo().fooA();
22
23

this.fooB.call(this,"sorry")执行了如下几个操作:

1this.temp = this.fooB;
2
3this.temp("sorry");
4
5delete (this.temp);
6

其实,google Map API 的继承就是使用这种方式。大家可以下载的参考参考(maps.google.com)

4prototype.js中的实现方式

 1Object.extend = function(destination, source) {
 2
 3 for (property in source) {
分享到:
评论

相关推荐

    一个JS类(收藏)

    《一个JS类(收藏)——深入理解Prototype.js与JavaScript原型机制》 在JavaScript的世界里,对象的继承和原型是至关重要的概念。Prototype.js是一个广泛使用的JavaScript库,它为JavaScript提供了许多面向对象编程...

    Javascript 面向对象程式学习笔记收藏

    总结,JavaScript的面向对象编程主要涉及到构造函数、属性、方法、this关键字、原型链以及封装和继承等概念。理解这些基础是编写高效、可维护的JavaScript代码的关键。在实践中,开发者还需要考虑作用域、闭包、异步...

    javascript面向对象程序设计高级特性经典教程(值得收藏).docx

    本文详细介绍了 JavaScript 面向对象程序设计的一些高级特性,包括对象的创建、访问、删除、使用 `this` 值、内建对象的使用、原型的概念以及继承的实现方式。理解并掌握这些概念对于编写高质量、可维护的 ...

    Asp.net 2.0 自定义控件开发[开发一个图表(WebChart)控件(柱状图示例)](示例代码下载)收藏

    6. **客户端脚本支持**:为了增强用户体验,我们可能需要提供客户端API,让用户能够在浏览器端与图表交互,例如通过JavaScript实现鼠标悬停时显示数据详情。 在文件`SimpleGaugeBarControl`中,可能包含了实现上述...

    2022最新react面试题pdf下载高清「务必收藏」.pdf

    总结来说,React通过组件化、合成事件、事件代理、高阶组件、Render Props和Hooks等机制,提供了高效、灵活且易于理解的UI开发方式。随着React的发展,这些特性的改进和新特性如Hooks的引入,进一步提升了开发效率和...

    电子游戏收藏

    同时,TypeScript可以无缝对接现有的JavaScript库和框架,如React或Three.js,使得在构建游戏UI或3D场景时更加得心应手。 总结来说,TypeScript在电子游戏收藏和开发中的应用显著提升了代码质量和开发效率。它帮助...

    MyRecipes_

    总结起来,"MyRecipes_"项目是利用JavaScript技术构建的一个食谱管理应用,它利用了JavaScript的各种特性来提供用户友好的交互体验,如动态更新内容、处理用户输入和与服务器通信。JavaScript的学习和掌握对于想要...

    2021-2022计算机二级等级考试试题及答案No.14641.docx

    根据提供的文档内容,我们可以总结和扩展出以下几个关键的IT知识点: ### 1. HTML基础知识 - **HTML(HyperText Markup Language)**:是一种用于构建网页的标准标记语言。它使用一系列预定义的标记来描述文本、...

    基于springboot的相亲网站源码数据库.doc

    - 面向对象:支持封装、继承和多态等面向对象特性,易于扩展和维护。 #### 三、系统功能模块分析 1. **婚礼公司管理**:包括婚礼公司的基本信息录入、修改和删除等操作。 2. **婚礼公司收藏管理**:允许用户将感...

    2021-2022计算机二级等级考试试题及答案No.14674.docx

    根据给定文件的信息,我们可以总结出以下相关的IT知识点: ### 1. 队列的基本概念 - **队列**是一种特殊的线性表,主要特点是先进先出(First In First Out, FIFO)。队列中的元素从一端(队尾)添加,从另一端...

    2021-2022计算机二级等级考试试题及答案No.1846.docx

    根据提供的文件信息,我们可以总结出一系列关于计算机二级等级考试的关键知识点。这些知识点涵盖了浏览器操作、编程基础、面向对象编程、数据库管理、网络基础知识等多个方面。 ### 1. 浏览器操作 - **收藏功能**...

    2021-2022计算机二级等级考试试题及答案No.18801.docx

    - **浏览器与服务器**:JavaScript不仅可以运行在浏览器环境中,也可以在服务器端运行,如Node.js平台。正确的答案是 **A**:“True”。 ### 23. 组合框事件 - **Change 事件**:在Windows Forms应用程序中,组合...

    2021-2022计算机二级等级考试试题及答案No.16111.docx

    根据给定文件的信息,我们可以总结出一系列关于计算机二级等级考试的知识点,具体如下: ### 1. 访问协议的概念 - **知识点说明**:URL(Uniform Resource Locator,统一资源定位符)是互联网上用于标识资源位置的...

    2021-2022计算机二级等级考试试题及答案No.11006.docx

    根据给定文件的信息,我们可以总结出一系列与计算机二级等级考试相关的知识点。这些知识点涉及了基本的计算机操作、网络浏览器使用、JavaScript编程基础、数值转换、办公软件应用、VBA表达式编写、数据库管理等方面...

    2021-2022计算机二级等级考试试题及答案No.4784.docx

    8. **面向对象编程**:子类继承父类的属性、事件和方法体现了面向对象的继承性。 9. **查询与视图**:查询和视图都可以基于源数据创建,但视图的更新能力取决于其源数据的定义,某些视图可以更新,而有些则不行。 ...

    Mamba个人博客微信开发小程序版 v1.0

    它继承了 Vue.js 的设计理念,让开发者可以使用 Vue.js 的语法和开发习惯来编写小程序,降低了学习曲线,提高了开发效率。通过 Mpvue,我们可以轻松实现组件化开发,使得代码组织更加清晰,易于维护。 其次,Bmob...

    基于web的ssh在线音乐系统

    1. **Struts2**:Struts2是一个强大的MVC框架,它继承了Struts1的优点,并引入了更多现代Web应用的特性。它负责接收用户的请求,调度控制流,与视图和模型进行交互。在这个音乐系统中,Struts2配置文件定义了各种...

    2021-2022计算机二级等级考试试题及答案No.12274.docx

    根据给定文件的信息,我们可以总结出以下几个重要的知识点: ### 1. 栈和队列的特点 **知识点**:栈和队列是两种基本的数据结构,它们的主要区别在于数据的访问方式。 - **栈**(Stack)是一种后进先出(LIFO, ...

    基于springboot在线课程管理系统源码数据库.doc

    - **课程收藏管理**:学生对感兴趣课程的收藏。 - **通知公告管理**:发布校园新闻或课程相关通知。 ##### 3.2 系统架构设计 本系统采用了B/S三层架构(浏览器/服务器)模式,前端负责用户界面展示,后端处理业务...

Global site tag (gtag.js) - Google Analytics