OOP思想

OOP思想

读者朋友们大家好,我们今天这一讲就接着前面的封装继续讲解,今天就是在前面内容上面的升级,OOP思想中的继承,我们就先来解释一下继承到底是什么意思,我们在什么地方会用到继续。

  继承就是,后代继续祖先的一系列属性,行为。后代仍然算是与祖先同族,下面我们再用一些具体描述,来理解一下什么是继承

中国人,跟美国人都是 继承自 人类祖先,所以我们具有相同的属性行为,但是还有一定的差异,后面我们们将继续讲到的多态,所以通过上面的示例图,我们可以清晰的知道,人与人之前其实大同小异,所以我们再看看下面的示例代码,我们就知道,用代码来模拟继承,我们就又可以知道一种方法来写尽量少的代码达到做尽量多的事。

//遗传继承函数
function Extend(Children,Parent){
    //这里仅仅只是继承的原型链接定义的行为
    for(var p in Parent.prototype){
        Children[p] = Parent.prototype[p];
    }
}
//人类祖先
function Human(){
    this.weight = "50kg";
    this.height = "180cm";
    this.hair = "棕色";
}
//吃饭
Human.prototype.Eat = function(){
    console.log("吃饭");
}
//说话
Human.prototype.Say = function(){
    console.log("大家好我是地球人");
}
//行走
Human.prototype.Walk = function(){
    console.log("我是人类,天生就可以两条腿直立行走");
}
//繁衍
Human.prototype.Multiply = function(){
    console.log("跟老婆一起做羞羞的事,就是为了人类的繁荣");
}

//中国人
function Chinese(){
    //调用继承函数
    Extend(this,Human);
}
//美国人
function American(){
    //调用继承函数
    Extend(this,Human);
}

我们就这样写,就模拟了高级语言中的继承,下面我们看看运行后,有没有问题

运行后,我们发现了问题,这样写,我们已经可以实现原型链接的继承了,而且也大大的节省了很多代码,我们在写Chinese和American函数的时候,是不是只写了少量代码,我们就把父类行为给继承过来了,而实例也能调用父类所拥有的行为函数,但是这样写,我们还没有完全实现继承,因为我们在调用hair属性的时候就根本没有起到作用,那么,我们再修改一下代码,就可以实现完全继承了

//遗传继承函数
function Extend(Children,Parent){
    //现在我们是从父类实例来继承,所以属性和方法都会被继承的
    for(var p in Parent){
        if(typeof Children[p] == "undefined"){
            Children[p] = Parent[p];
        }
    }
}
//人类祖先
function Human(){
    this.weight = "50kg";
    this.height = "180cm";
    this.hair = "棕色";
}
//吃饭
Human.prototype.Eat = function(){
    console.log("吃饭");
}
//说话
Human.prototype.Say = function(){
    console.log("大家好我是地球人");
}
//行走
Human.prototype.Walk = function(){
    console.log("我是人类,天生就可以两条腿直立行走");
}
//繁衍
Human.prototype.Multiply = function(){
    console.log("跟老婆一起做羞羞的事,就是为了人类的繁荣");
}
//中国人
function Chinese(){
    //调用继承函数
    Extend(this,new Human());
}
//美国人
function American(){
    //调用继承函数
    Extend(this,new Human());
}

我们还是要看一下运行的效果是不是跟我们想象中的一样?

通过上在的代码我们不难看出,现在的继承函数实际上是从Human类的具体实例中复制的属性及行为,这样我们就更进一步模拟出了类的继承,在上面有一句,我还需要给大家解释一下

if(typeof Children[p] == "undefined"){
  ......
}

这里出现的typeof关键字其实是一个运算符,是查看某个变量是什么类型,如果是未定义的情况,运算出的结果就是 "undefined" ,所以我就是这样比较,如果子类没有定义过这样的属性或者行为函数,那么就从父类继承(注:这里的解释是为了后面的多态作铺垫)。

  接下来我们再来看一下可不可以多重继承,前面我们已经提到Chinese与American两个类都是继承自Human类,下面我们再写一个类来继承自Chinese

//四川人
function SiChuanMan(){
    Extend(this,new Chinese());
}

现在我们已经写出很健壮的继承代码,理解也非常的简单,只要在声明新类的时候,在构造函数里面调用一下继承函数,我们就可以实现属性及行为函数的完全继承,这样,我们就可以省下大量的代码,OOP思想的优势再一次地被体现了出来,如果我们要模拟中国每个省份的人,如果我每个省份都照着Human类的方式去写,从太阳出来写到第二天的太阳落坡都写不完。继承的写法多种多样,每个人都有自己的写法,这里,我就是以一种最简单的方式给大家讲解的,到后面大家能熟练使用时候,也可以以自己喜欢的方式去写,javascript本身就是一门很灵活的语言。

  总结一下,我们今天在封装基础上进一步做了升级,这样我们就实现了对象的继承,书写的代码量被进一步被压缩,想想能提高工作的效率,更能提高代码的优雅度,是不是有一点的小激动呢,只要跟着我脚步走,我们就可以用最简单的方式去理解最复杂的东西,其实程序并不复杂,复杂的原因是大家没有得到正确的带领,本来很简单的一个东西,被不同的人理解及解释成不同的东西,这样学习起来就复杂了,更多的是没有连续的教程一步一步地带领大家向正确的方向迈进,所以很长时间都很难得到提升。

时间: 2024-10-11 22:43:17

OOP思想的相关文章

拖拽系列二、利用JS面向对象OOP思想实现拖拽封装

接着上一篇拖拽系列一.JavaScript实现简单的拖拽效果这一篇博客将接着对上一节实现代码利用JS面向对象(OOP)思维对上一节代码进行封装; 使其模块化.避免全局函数污染.方便后期维护和调用:写到这里突然想起一句话“没有任何一个题目是彻底完成的.总还会有很多事情可做......” 我想这句话程序开发大概也适用吧,前端开发人员总是可以结合自己之前学到“拖拽”相关知识,不断扩展.完善.无穷无尽.......     利用匿名函数自执行实现封装 ;(function(){ //do somethi

JQuery OOP 及 OOP思想的简易理解

在项目维护的时候,看到通篇的function实际上是非常费(痛)劲(苦),个人对于前端也不是特别熟悉,就想着JQuery能否也建立OOP的写法? 目的便于日后代码维护管理,就算不为了自己,日后交接后也能让另一个攻城狮,一目了然的定位错误. 一.oop.html 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1

javascript大神修炼记(7)——OOP思想(多态)

读者朋友们大家好,今天我们就接着前面的内容讲,前面我们已经讲到了继承,今天我们就来讲OOP目前最后一个体现,那就是多态,因为javascript语言的灵活性,所以我们是没有办法使用接口的,所以这也给js程序带来了一定的困惑,大家也不用太着急关心这个问题,因为这些到后面ECMAScript后面的版本会给我们解决这些问题的,又扯远了,还是回到正题,OOP的多态,前面我们已经可以很明白的理解继承是什么样子的了,就是先声明一个父类,然后,我们可以写很多的子类来继承父类的属性和方法,这些我们就可以用最少的

Delphi编程OOP思想【转】

原文:http://blog.sina.com.cn/s/blog_9c47a15201015rew.html 注:本文摘自http://blog.csdn.net/haiou327/article/details/5937171,转载请注明: 好东西大家分享 刚刚接触的Delphi的朋友,可能最感兴趣的就是它丰富.强大的VCL(可视化构件库).仅仅向窗体上扔几个构件,甚至不用动手写代码,就能很容易地做出一个有实用价值的程序,真是令人激动.但是,VCL只是Delphi的一小部分,Delphi的优

OOP思想:封装、继承、多态

1. 构建一个动物类作为父类,猫科动物子类继承动物类,老虎子类继承猫科 动物 每个类都实现一个不同的cry方法. 借口文件1:Animal.h #import <Foundation/Foundation.h> @interface Animal : NSObject- (void) cry; @end 实现文件1:Animal.m #import "Animal.h" @implementation Animal- (void) cry{    NSLog(@"

OOP思想:封装、继承、多态(续)

借口文件1:Bird.h #import <Foundation/Foundation.h> @interface Bird : NSObject{@private    int _weight;    NSString *_name;}- (void)fly; @end 实现文件1:Bird.m #import "Bird.h" @implementation Bird- (void)fly{    NSLog(@"%@",@"Bird is

JavaScript OOP 思想

JS的核心是对象 {}, new function(){}这种形式也是对象. http://www.nowamagic.net/librarys/veda/detail/241 整理一些网上的资料,供参考 1.创建对象 1.1 new 用new进行创建对象: [javascript] view plaincopyprint? var user = new Object(); user.age = 12;//同时为对象添加属性 user.name = ‘ajun’; 1.2{} 用{}创建对象,如

OOP思想又一随笔

现有类再有对象, 类:对现实世界事物的抽象表示,包括事物的状态信息(成员变量)和行为信息(成员方法).我们要让我们的计算机程序设计更有意思,也更有逻辑性,则我们的程序中对事物的描叙就必须符合真实情况,同时符合人类的思维习惯.因此,我们如果在计算中要描叙人这个事物,也是一类事物,我们就必须把该事物的所有特点包含进来,用成员变量描叙人的基本属性,如:身高,体重,年龄,性别等.这样就可以描叙一个"静态"的人了,所谓静态的意思也就是该人并不参与任何社会活动,没有任何行为.但是这样并不符合现实意

基于 CSP 的设计思想和 OOP 设计思想的异同

LinkerLin Go语言推崇的CSP编程模型和设计思想,并没有引起很多Go开发者包括Go标准库作者的重视.标准库的很多设计保留了很浓的OOP的味道.本篇Blog想比较下从设计的角度看,CSP和OOP到底有什么区别. 下面,我们来看一个例子,如果我们有一个项目,需要做一个TCP连接中继器(请原谅我的用词).我们先按照OOP来设计下: 系统的结构:需要有一个客户端和一个服务器端.分两个进程分别跑在不同机器上. 系统对象关系拆分(这里有所简化,E-R图等省略):连接中继器类--系统的主类.conf