`
天梯梦
  • 浏览: 13630474 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

javascript 中面向对象实现 如何继承

 
阅读更多

上一篇博客已经说了关于javascript中的封装, 其中也说了javascript中本来是没有类的,我们上一篇的封装也是用javascript中的函数去模拟一个类,最后我们还模拟了一个构造函数.那 么今天和大家分享的关于继承,同样不是真正严格意义上面向对象的继承,而是通过javascript中的原型链关系实现函数之间的属性,方法共享.下面简 单分享几种封装的方法.

 

既然说到继承,我们必须有一个基类

function Person(){
    this.eat=function(){
        return '吃食物';
    }
}

Person.prototype.sport=function(){
    return '运动';
}

 

 

Person 这个基类包含了2个属性,吃和运动.但是奇怪的是在构造函数(当然是模拟的)中定义了一个属性 eat ,我们赋值了一个方法,方法返回吃食物.

 

然后又在Person 类的原型上定义了一个属性 sport ,赋值一个方法,返回运动.

其实这2个属性完全可以都放在 构造函数,或者全部定义在原型对象上,没有问题,我们这里分别定义只是为了演示后面子类继承基类后实例化的对象能不能100%继承基类里定义的这2种方式呢? 我们下面一一举例查看.

 

(一)第一种继承方式,构造函数里绑定

 

下面我要定义一个子类,学生,让学生继承人,并且在学生的构造函数里绑定基类 Person

function Student(name){
    Person.apply(this,arguments);
    this.name=name;
}

 

如何实现的绑定,就是javascript中的 apply 和 call 方法,这2个方法实现目的相同,只是参数格式不一样,看这里 call 和 apply 实现继承的区别

 

我用JS Runner 来演示一下,为了在工具下方打印出来,重写了 print 函数:

var print=function(text){
    var t='';
    for(item in arguments){
        t+= arguments[item]+',';
    }
    document.write(t+'<br/>');
}

 

你可以不关注上面这个函数,如果你在chrome 的控制台调试, mac下 option + command +i 即可掉出来,用 console.log 就可以输出结果.222

 

红框是工具方法,为了在下发打印出来,重写了 print 方法.

蓝框是基类 Person

绿框是子类 Student

黑 框是输出语句, name 属性和 study() 方法是子类定义的.打印没有问题, eat() 方法是基类定义,看了继承了基类这个方法,但是基类还有一个原型上的方法 sport() ,我们再来看下这个方法. xiaoming.sport() ,结果报错,如下:

TypeError: undefined is not a function (evaluating 'xiaoming.sport()')

到这里你就看到了构造函数绑定的弊端了,它是有局限的,在子类 构造函数里绑定基类,只能继承来自基类构造函数定义的属性,方法,对于基类原型 prototype 对象上定义的属性,方法都是不能被子类继承的.

 

(二)子类原型继承基类

还是刚才的例子,Student 的原型就是 Student.prototype

Student.prototype=new Person();

 

这一句的含义就是把子类原型指针指向基类的实例.这样也可以继承基类的属性方法.333

和上面的图不同的有2个地方,红框部分是子类继承基类,打印的时候最后把基类的2个方法都打印出来了.

看上去相当完美,基类构造函数的属性和基类原型链上的属性统统能继承.

 

(三) 子类原型继承基类原型

和上面的方法大同小异,区别就是把上面基类的对象变成了基类的原型444

上面图片和第一幅图片有2处差异,红框处 Student.prototype 继承了 基类 Person.prototype

绿框处输出了子类的所有属性,方法,但是,基类的方法只有原型上的可以输出,我们尝试输出 xiaoming.eat(); 结果报错:

32	TypeError: undefined is not a function (evaluating 'xiaoming.eat()')

子类原型继承基类原型过程中,基类构造函数定义的属性,方法都将不会继承到子类.

 

原文:http://yijiebuyi.com/blog/bc5a9d2f60b829d6e7d052541f9ae681.html

本文转自:javascript 中面向对象实现 如何继承

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    JavaScript面向对象编程指南.pdf

    JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在... 《JavaScript面向对象编程指南》着重介绍JavaScript在面向对象方面的特性,展示如何构建强健的、可维护的、功能强大的应用程序及程序库

    JavaScript面向对象编程指南

    《JavaScript面向对象编程指南》内容包括:JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在JavaScript中的运用;数据类型、操作符以及流程控制语句;函数、闭包、对象和原型等概念,以代码...

    javascript面向对象编程

    JavaScript作为一门浏览器语言的核心思想;...如何实现JavaScript中缺失的面向对象特性,如对象的私有成员与私有方法;如何应用适当的编程模式,发挥JavaScript语言特有的优势;如何应用设计模式解决常见问题等。

    javaScript面向对象继承方法经典实现.docx

    javaScript面向对象继承方法经典实现.docx

    JavaScript程序设计课件:面向对象概述.pptx

    面向对象有封装、继承、多态性的特性,所以具有易维护、易复用、易扩展的特点。 类的调用需要实例化,开销较大,因此性能方面较面向过程低。 6.1.1 面向过程与面向对象 6.1 面向对象概述 主讲:重庆机电职业技术大学...

    Javascript面向对象特性实现(封装、继承、接口).doc

    Javascript面向对象特性实现(封装、继承、接口 Javascript面向对象特性实现(封装、继承、接口

    JavaScript的面向对象特性浅析与范例

    传统方式对JavaScript的应用基本上是基于过程模型的,若在JavaScript中利用面向对象的思想进行代码编写,将会使得代码具有良好的结构和逻辑性,更便于管理和维护。本文让读者看到JavaScript如何实现面向对象编程并...

    javascript 原生态js类继承实现的方式

    我们还知道,面向对象编程有三个重要的概念 - 封装、继承和多态。 但是在JavaScript的世界中,所有的这一切特性似乎都不存在。 因为JavaScript本身不是面向对象的语言,而是基于对象的语言。

    JavaScript面向对象编程

    Javascript是一种面向(基于)对象的动态脚本语言,是一种基于对象(Object)和事件驱动 (EventDriven)并具有安全性能的脚本语言。他具有面向对象语言所特有的各种...javascript的面向对象语言特性是我们必须完全把握的。

    学习javascript面向对象 javascript实现继承的方式

    本文实例为大家介绍了javascript实现继承的6种方式,分享给大家供大家参考,具体内容如下 1、【原型链继承】实现的本质是重写原型对象,代之以一个新类型的实例。实际上不是SubType的原型的constructor属性被重写了...

    JavaScript面向对象编程指南 英文版

    《JavaScript面向对象编程指南》内容包括:JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在JavaScript中的运用;数据类型、操作符以及流程控制语句;函数、闭包、对象和原型等概念,以代码...

    Javascript面向对象程序设计培训讲义

    由于JS不是纯的面向对象的语言,所以对象的继承是以原型函数的形式继承的,很多人刚开始接触的时候不太理解,但是JS这种以原型函数的形式实现面向对象技术,不仅是可行的,而且还为面向对象技术提供了动态继承的功能...

    JavaScript面向对象编程指南 有书签

    《JavaScript面向对象编程指南》内容包括:JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在JavaScript中的运用;数据类型、操作符以及流程控制语句;函数、闭包、对象和原型等概念,以代码...

    讲解JavaScript的面向对象的编程

    本人一行注释一行代码翻译了该大师的艺术作品--目的说明它是在第1,2阶段文档演示的JavaScript面向对象的书写方式的进一步改进,它是现代JavaScript面向对象编程方式(使用基本类来编码)的过渡代码--没有它就没有当今...

    Javascript简单实现面向对象编程继承实例代码

    主要介绍了Javascript简单实现面向对象编程继承实例代码,简单分析了面向对象程序设计的特征与继承的具体实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics