`
lj830723
  • 浏览: 131888 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Javascript 面向对象之封装

阅读更多
学习javascript,最难的地方是什么?个人感觉,Object(对象)最难。因为javascript的Object模型很独特,和其他语言都不一样,初学者不容易掌握。
javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象。但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类)。
那么,如果我们要把"属性"(property)和"方法"(method),封装成一个对象,甚至要从原型对象生成一个实例对象,我们应该怎么做呢?
1. 生成对象的原始模式
假定我们把猫看成一个对象,它有"名字"和"颜色"两个属性。
 var Cat = { 
    name : '', 
    color : '' 
  }

然后生成实例对象,就等于是在调用函数:
  var cat1 = Cat("大毛","黄色"); 
  var cat2 = Cat("二毛","黑色");

这种方法的问题依然是,cat1和cat2之间没有内在的联系,不能反映出它们是同一个原型对象的实例。
3. 构造函数模式
为了解决从原型对象生成实例的问题,javascript提供了一个构造函数(Constructor)模式。
所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量。对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例对象上。 比如,猫的原型对象现在可以这样写,
   function Cat(name,color){ 
    this.name=name; 
    this.color=color; 
  }

我们现在就可以生成实例对象了。
   var cat1 = new Cat("大毛","黄色"); 
  var cat2 = new Cat("二毛","黑色"); 
  alert(cat1.name); // 大毛 
  alert(cat1.color); // 黄色

这时cat1和cat2会自动含有一个constructor属性,指向它们的构造函数。
   alert(cat1.constructor == Cat); //true 
  alert(cat2.constructor == Cat); //true

javascript还提供了一个instanceof运算符,验证原型对象与实例对象之间的关系。
   alert(cat1 instanceof Cat); //true 
  alert(cat2 instanceof Cat); //true

4. 构造函数模式的问题。
    构造函数方法很好用,但是存在一个浪费内存的问题。 请看,我们现在为Cat对象添加一个不变的属性"type"(种类),再添加一个方法eat(吃老鼠)。那么,原型对象Cat就变成了下面这样:
   function Cat(name,color){ 
    this.name = name; 
    this.color = color; 
    this.type = "猫科动物"; 
    this.eat = function(){alert("吃老鼠");}; 
  }

还是采用同样的方法,生成实例:
   var cat1 = new Cat("大毛","黄色"); 
  var cat2 = new Cat ("二毛","黑色"); 
  alert(cat1.type); // 猫科动物 
  cat1.eat(); // 吃老鼠

表面上好像没什么问题,但是实际上这样做,有一个很大的弊端。那就是对于每一个实例对象,type属性和eat()方法都是一模一样的内容,每一次生成一个实例,都必须为重复的内容,多占用一些内存。这样既不环保,也缺乏效率。
   alert(cat1.eat == cat2.eat); //false

能不能让type属性和eat()方法在内存中只生成一次,然后所有实例都指向那个内存地址呢?回答是可以的。
5. Prototype模式。
    javascript规定,每一个构造函数都有一个prototype属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。 这意味着,我们可以把那些不变的属性和方法,直接定义在prototype对象上。
   function Cat(name,color){ 
    this.name = name; 
    this.color = color; 
  } 
  Cat.prototype.type = "猫科动物"; 
  Cat.prototype.eat = function(){alert("吃老鼠")};

 //然后,生成实例。
   var cat1 = new Cat("大毛","黄色"); 
  var cat2 = new Cat("二毛","黑色"); 
  alert(cat1.type); // 猫科动物 
  cat1.eat(); // 吃老鼠

这时所有实例的type属性和eat()方法,其实都是同一个内存地址,指向prototype对象,因此就提高了运行效率。
  alert(cat1.eat == cat2.eat); //true

6. Prototype模式的验证方法。
    isPrototypeOf() 这个方法用来判断,某个proptotype对象和某个实例之间的关系。
   alert(Cat.prototype.isPrototypeOf(cat1)); //true 
  alert(Cat.prototype.isPrototypeOf(cat2)); //true

hasOwnProperty() 方法,每个实例对象都有一个hasOwnProperty()方法,用来判断某一个属性到底是本地属性,还是继承自prototype对象的属性。
   alert(cat1.hasOwnProperty("name")); // true 
  alert(cat1.hasOwnProperty("type")); // false

in运算符可以用来判断,某个实例是否含有某个属性,不管是不是本地属性。
   alert("name" in cat1); // true 
  alert("type" in cat1); // true

in运算符还可以用来遍历某个对象的所有属性。
for(var prop in cat1) { 
    alert("cat1["+prop+"]="+cat1[prop]); 
}
分享到:
评论

相关推荐

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

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

    JavaScript面向对象程序设计

    JavaScript面向对象程序设计(1): 前言 JavaScript面向对象程序设计(2): 数组...JavaScript面向对象程序设计(6): 封装 JavaScript面向对象程序设计(7): 闭包 JavaScript面向对象程序设计(8): 优雅的封装还是执行的效率?

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

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

    javascript面向对象包装类Class封装类库剖析.docx

    javascript面向对象包装类Class封装类库剖析.docx

    js面向对象封装拖拽移动功能,兼容pc和移动端

    采用JavaScript面向对象思想封装拖拽移动功能,兼容pc端和移动端,适合JavaScript初学者进阶学习。

    JavaScript面向对象实现简单工厂模式

    本文件使用JavaScript已面向对象方式封装类来演示简单工厂模式的实现代码。以实例介绍了简单功能模式的用途,简单分析了实现的要件。mhtl文件里有实例代码的全部内容和分析简述。

    Javascript 面向对象编程

    但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类)。 那么,如果我们要把"属性"(property)和"方法"(method),封装成一个对象,甚至要从原型对象生成一个实例对象,我们应该怎么...

    JavaScript面向对象编程指南

    JavaScript面向对象编程指南,关于对象,属性,方法,类,封装,继承,多态的详细讲解和介绍

    JAVA面向对象基础测试题-继承-封装-多态等测试题.docx

    JAVA面向对象基础测试题-继承-封装-多态等测试题.docx

    Javascript面向对象编程

    javascript的特点 简单 动态 基于对象(面向对象) Javascript面向对象概述 Javascript是一种面向(基于)对象的动态脚本语言,是一种基于对象(Object)和事件驱动(EventDriven)并具有安全性能的脚本语言。他具有面向...

    学习Java程序入门-面向对象之封装,继承,多态(下).docx

    学习Java程序入门-面向对象之封装,继承,多态(下).docx

    JavaScript面向对象编程

    本电子书包括专业JavaScript 编程的基础:编写面向对象代码,测试代码,为分发而进行封装。随后你看到了 Unobtrusive DOM 脚本编程的主要方面,包括一个关于文档对象模型,事件,JavaScript 与CSS 交互的简短的总览...

    .net_面试题_javascript面向对象编程

    要求: 用javascript封装一个类,实现动态构造导航菜单功能,数据格式为data.xml 要求: 1.运用面向对象的思想设计该类(如继承)。 2.实现效果参考 "示例.bmp",菜单样式整洁即可。 3.两天内完成。

    javascript面向对象三大特征之封装实例详解

    本文实例讲述了javascript面向对象三大特征之封装。分享给大家供大家参考,具体如下:封装封装(Encapsulation):就是把对象内部数据和操作细节进行隐藏。很多面向对象语言都支持封装特性,提供关键字如private来隐藏...

    ExtJS4中文教程2 开发笔记 chm

    Javascript 面向对象之封装 Javascript 面向对象之构造函数的继承 Javascript 面向对象之非构造函数的继承 JavaScript对象与继承教程之内置对象(下) JavaScript对象及继承教程(上) javascript正则表达式(一) ...

    面向对象的JavaScript包装类

    自己封装的一个面向对象的JavaScript类。

    JavaScript面向对象技术实现树形控件

    树形控件具有独特的扩展和折叠分支的能力,能够以较小的空间显示出大量的信息,一目了然地传达出数据之间的层次关系。凡是熟悉图形用户界面的用户,都能够自如地运用树形控件。

    学习Javascript面向对象编程之封装

    主要帮助大家学习Javascript面向对象编程之封装,由浅入深的介绍了封装的概念定义,感兴趣的小伙伴们可以参考一下

    Javascript之面向对象–封装

    第一步:做一个“手机的类” var MobilePhone = (function(){  ………… })() 第二步:考虑这个类,里需要那些类的私有属性,这里我想定义的是实例出来手机的数量 var MobilePhone = (function(){ ...

Global site tag (gtag.js) - Google Analytics