面向对象理论

面向对象编程举例

  1. 初步实现(面向过程的方式)
  2. 函数封装
  3. 对象封装

创建对象的方式

  1. 字面量
    js
    var obj = {
    key: value,
    key1: value1
    };

    //$().css({})
    //$.ajax({})
    //复用性差

    2. 内置构造函数
    js
    var obj = new Object();
    obj.key = value;
    obj.key1 = value1;

//复用性差

3. 自定义构造函数
```js
function Person(){
    this.key = value;
    this.key1 = value1;
}

var p = new Person();

构造函数

什么是构造函数

构造函数就是一个函数,他和普通函数的区别在于,他一般被用来初始化对象!!

构造函数的特点

  1. 首字母大写
  2. 一般和new关键字一起使用
  3. 不需要写return语句,默认返回new创建出来的对象

构造函数的执行过程

  1. 使用new关键字创建对象
  2. 调用构造函数,将构造函数中的this指向new创建出来的对象
  3. 执行构造函数中的代码,通过this为创建的对象新增属性和方法
  4. 默认的返回了new创建出来的对象

构造函数的注意事项

  1. 如果手动给构造函数写了return语句

    • 如果return的是值类型的数据,对默认返回值不会有任何影响
    • 如果return的是引用类型的数据,则返回的是该引用类型的数据
  2. 如果把构造函数当做普通函数来调用
    • this会指向window
    • 返回值会和普通函数一样

构造函数写法存在的问题

function Person(){
    this.name = "";
    //每次创建对象都会重新执行一次函数声明,也就是创建一个新的函数
    //每个对象中都会有这么一个方法,但是每个方法的功能都是一样的,所以造成资源浪费
    this.sayHello = function(){

    };
}
//解决方案:
// 将方法的声明提出来放到构造函数外面,每次给对象的方法赋值的时候,直接将外面声明好的函数直接赋值给对象的方法,这样,所有的对象就都共享同一个方法了

function sayHello(){}

funciton Person(){
    this.name = "";
    this.sayHello = sayHello;
}

//这么解决会造成全局变量污染以及代码结构混乱的问题

原型

原型的概念

构造函数在创建出来的时候,系统会默认的帮构造函数创建并且关联一个空对象,这个对象就是原型

原型的作用

在原型中的所有的属性和方法,可以被和其关联的构造函数创建出来的所有的对象共享!

原型的访问方式

  1. 构造函数.prototype
  2. 对象.__proto__ (有兼容性问题)

原型的使用方式

  1. 利用对象的动态特性,给系统创建好的默认的原型中新增属性和方法
    js
    Person.prototype.name = "";
  2. 直接给构造函数.prototype属性赋值一个新的对象!

原型的使用注意事项

  1. 一般将需要共享的内容放在原型当中,对象特有的东西放在对象本身中
  2. 使用对象.属性获取对象的属性的时候,会先在对象本身进行查找,如果有就使用,如果没有,就会去原型中进行查找
  3. 使用对象.属性 = 值,给对象的属性赋值的时候,会直接在直接在对象本身进行查找,如果有,就修改,如果没有,就新增这个属性
  4. 在使用构造函数.prototype=新的对象的时候, 赋值之前创建的对象和赋值之后创建的对象的原型不一样

面向对象的三大特性

  • 封装:将功能的具体实现封装在对象内部,只对外界暴露指定的接口,外界在使用的时候,只需要关心接口如何使用,而不需要关心对象内部功能的具体实现,这就是封装 (ATM,电脑)
  • 继承:自己没有的东西,别人有,拿过来使用,就是继承(js中的继承是基于对象的!)
  • 多态:js中没有多态!

继承的实现方式

  1. 混入式继承(mix-in)
    ```js
    var obj = {};
    var obj1 = {
    name: "",
    age: 18
    }

for(var k in obj1){
obj[k] = obj1[k];
}

2. 原型继承
    * 直接将要继承的对象,赋值给构造函数的prototype属性,这样创建出来的所有的对象能够访问的原型就是这个要继承的对象,也就是说实现了继承!
```js
function Person(){

}
var obj = {
    name: "",
    age: 18
}

Person.prototype = obj;
* 利用混入的方式,将要继承的对象中的所有的方法和属性,添加到构造函数默认的原型中去
function Person(){

}
var obj = {
    name: "",
    age: 18
}
for(var k in obj){
    Person.prototype[k] = obj[k];
}
  1. 经典继承
    ```js
    //Object.create
    var obj1 = {
    name: "",
    age: 18
    }
    var obj = Object.create(obj1);
    //创建出来一个新的对象obj,obj的原型就是obj1

function myCreate(obj){
if(Object.create){
return Object.create(obj);
}else{
function F(){}
F.prototype = obj;
return new F();
}
}

时间: 2024-09-08 17:45:29

面向对象理论的相关文章

JavaScript面向对象的支持(3)

javascript|对象 ================================================================================Qomolangma OpenProject v0.9 类别    :Rich Web Client关键词  :JS OOP,JS Framwork, Rich Web Client,RIA,Web Component,          DOM,DTHML,CSS,JavaScript,JScript 项目发

JavaScript面向对象程序设计(1) 前言

基于对象还是面向对象? 面向对象技术是现代软件开发中的重要技术之一.面向对象变成的好处毋庸置疑,现在的主流语言如 Java.C++都是面向对象的.现在的面向对象理论更多的是使用Java或C++进行描述,究其根源,在于这 些语言都是传统的面向对象语言,具有面向对象理论所指明的一切特性:类.封装.继承.多态等等. 相比而言,一些动态语言如JavaSript就显得不那么面向对象--至少,在JavaScript中 并没有类class这一关键字.但是,在JavaScript中并不是没有类的概念.于是有人说

uml学习入门 1 面向对象概述

很久没有写过东西了,在开发过程中明显的感觉到很多程序员对UML与面向对象理论方面的理解不够,所以打算写一个UML的系列文章来一次扫盲. 这是第一节,主要先来确定几个基础的概念. 1.什么是对象 对象(Object)是面向对象的基本构造单元.是一些变量和方法的集合,用于模拟实现世界中的一些事物模型.如一台电脑,一个人,一间房子等.当然也可以模拟一些虚拟的东西,比如一个学号,一个编号,一个院系等. 2.面向对象与面向过程的区别 面向对象"什么做什么"与面向过程"做什么"

《面向对象分析与设计》一1.5面向对象方法的发展史及现状简介

1.5面向对象方法的发展史及现状简介 在这里把面向对象方法的发展分为三个阶段:雏形阶段.完善阶段和繁荣阶段. (1) 雏形阶段 20世纪60年代挪威计算中心开发的Simula 67,首先引入了类的概念和继承机制,它是面向对象语言的先驱.该语言的诞生是面向对象发展史上的第一个里程碑.随后20世纪70年代的CLU.并发Pascal.Ada和Modula2等语言对抽象数据类型理论的发展起到了重要作用,它们支持数据与操作的封装.犹他大学的博士生Alan Kay设计出了一个实验性的语言Flex,该语言从

Javascript 面向对象特性_javascript技巧

1. JavaScript中的类型 -------- 虽然JavaScript是一个基于对象的语言,但对象(Object)在JavaScript中不是第一型的.JS 是以函数(Function)为第一型的语言.这样说,不但是因为JS中的函数具有高级语言中的函 数的各种特性,而且也因为在JS中,Object也是由函数来实现的.--关于这一点,可以在 后文中"构造与析构"部分看到更进一步的说明. JS中是弱类型的,他的内置类型简单而且清晰: ------------------------

OOP和RDBMS不匹配,谁向谁妥协,还是找个和稀泥的?

OOP和RDBMS不匹配        OOP的面向对象理论和RDBMS所基于的关系理论本来就不是一回事,理论不同,不匹配是很正常的事情,主要有以下表现:粒度   为了概念的清晰和责任的单一,对象的设计粒度比较细.比如,一个User对象包含一个Address对象,Address里面有country, city, street等属性.但是,为了性能等方面的考虑,数据库表的设计粒度相对较粗,就上例来讲,可能有一个只有User表,地址方面的country, city和street等只作为字段.多态  

在C#程序中实现插件架构

程序|架构 原文作者:Shawn Patrick Walcheske 译者:电子科技大学 夏桅 [引言] 在.NET框架下的C#语言,和其他.NET语言一样提供了很多强大的特性和机制.其中一些是全新的,而有些则是从以前的语言和平台上照搬过来的.然而,这种巧妙的结合产生了一些有趣的方法可以用来解决我们的问题.这篇文章将讲述如何利用这些奇妙的特性,用插件(plug-ins)机制建立可扩展的解决方案.后面也将提供一个简要的例子,你甚至可以用这个东西来替换那些已经在很多系统中广泛使用的独立的程序.在一个

《.NET软件技术学习与实践》之序言

  自序        这是一本有自已特色的书.       这是一本于讲技术之外,更讲学习方法的书       这是一本从首至尾贯彻"授人与鱼,不如授人与渔"的书       2003年暑假我在CSDN程序人生论坛发表的个人自传--<一个普通IT人的十年回顾>(已收入本书配套光盘),一石激起千层浪,被许多网站转载,我个人也收到了海内外近千封电子邮件.       我是一个在没有明师指导情况下,几乎完全靠自己在黑暗中摸索,在自学之路上艰难跋涉过来的软件开发者.我不敢自称为&

聚焦UML实践第一步

引子 前段时间和一个朋友在MSN上聊到UML,他一声叹息:"知道UML是好东西但是用不起来.尝试过,结果领导要求文档中要充分使用UML,事无巨细皆UML,结果本来很简单的一份设计文档加了一堆图.评审的时候团队还有牛人指出UML图中这里的菱形应该是实心的,那里的要用半个箭头- -结果开会大部分时间都在炒图怎么画.领导觉得这也没带来什么好处,同事们乐得摆脱,后来就不了了之了" 然后顺便抱怨了我一下: "你给我推荐的<UML Distilled>也不怎么样- -&quo