`
hufeng0901
  • 浏览: 18588 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

[转载]--放下对象 立地成佛——————迁徙JS的OOP(原文:http://februus.iteye.com/blog/1188114)

 
阅读更多
JavaScript简介
   通常,现代的Web可以划分为三大元素:CSS、HTML,当然还有JavaScript,这基本上可以说是一种模块化的思想:我们用CSS来使我们的页面对得起观众,我们用HTML让网页言之有物,而JavaScript让我们的页面看起来生动,也即功能的实现。这种JavaScript我们称之为不唐突的JavaScript。
    JavaScript,顾名思义,是一种script language(脚本语言),当然,它和Java并没有一毛钱的关系,这个只是NetScape(网景)公司市场部的馊主意,为了提高这门语言的知名度,单相思地改为了JavaScript,但是我不明白,在JavaEye更名为ITEye之后,JavaScript为什么不更名为ITScript 。这个名字的一个后果就是很多刚入门学Java的同学在图书馆会拿上一本JavaScript的书,一不小心就误入歧途了(或许这正是市场部希望看到的)。好吧,回到JavaScript的定义上来,它是一门跨平台、基于原型的面向对象的脚本语言(什么是基于原型的面向对象语言等会解释),这也是JavaScript的一大优势。当然,很多书本和论坛都会强调JavaScript是一种弱类型的语言,也就是说变量可以在不声明的情况下使用,这是因为JavaScript不像Java那样需要通过编译才能运行,它是通过解释器解释后运行的,因此JavaScript也是解释性语言,它的变量会在解释器工作时进行数据类型检测。(莫非JavaScript的老爸才是李刚,这么嚣张,竟然可以不事先声明变量的类型,而且也不用更换名字)。JavaScript的合法定义或许应该这么说:JavaScript是一门弱类型、基于原型的面向对象的、解释性的脚本语言。它的语法和Java等语言类似,运行环境一般是web浏览器。

JavaScript中的对象
   对象,相信接触过Java、C#等OOP语言的同志都明白,说来说去,就是由属性和方法组成的嘛。这里不展开讲我对对象的理解了,就JavaScript论JavaScript的对象吧还是。
    我们一般将JavaScript中可操作的对象划分为两种:一种是JavaScript的核心对象(数组对象、日期时间对象等),另一种是JavaScript宿主环境定义的各种对象。或者,可以从广义上讲,JS中都是对象,管你function还是其它什么玩意,统统看成对象,这就是人们常说的万物皆是对象。
    一般说来,JavaScript的核心对象(又称内置对象)有以下八种:
     ◎Array对象:用来表示数组的对象;
     ◎Boolean对象:用以支持布尔值;
     ◎Date对象:时间日期对象;
     ◎Math对象:用以支持一些常用的数学函数;
     ◎Function对象:函数支持对象;
     ◎String对象:字符串对象;
     ◎Number对象:提供对数字支持的对象;
     ◎RegExp对象:正则表达式对象;
   以上八种核心对象,除了Math之外,其它七种JavaScript都提供了具有构造器功能的一个实例化机制(有些观点认为那就是构造器,因为可以通过它们new出这些对象,比如date = new Date(),但是我认为这只是具有构造器的功能而已,它们还是有区别的,最显而易见的区别就是我们可以date = new Date;这样来创建一个对象,此时,就不能说这是一个构造函数了)。当然,和大多数的语言一样,Math都是直接调用其中的方法的,这就不难理解了。
    而用户自定义的对象就是通过定义一个函数来创建对象。这时,就得讨论function(函数)的对象化能力了(有一种观点认为在JS中,只有object和function才具有对象化的能力)。函数具有对象的特征,比如:
      function dog(){
       this.name = "Snoopy";
       this.age = 5;
       this.bark = function(){alert("Wow wow");}
        }; // end dog
     dog1 = new dog(); // 创建一个dog对象
   从这个实例可以看出,这个函数dog具有属性和方法,是不是又可以对其进行实例化呢。此时,又有好事者指出,这个不就像Java中的构造器吗?好吧,如果你认为这样有利于记忆和理解的话。但是,需要记住的是,函数可以动态的为对象增加或删除属性和方法,这些属性可以是对象。
    其实,我们根本没有必要纠结于一些名词,什么构造器、实例化机制啊,都只是一些表象,看到事物的本质才是关键,西藏有一个大喇嘛曾经说过:迷惑我们的不是事物本身,而是我们本身对事物的执着。也许,在看清了本质后就会发现,程序也不就是人类的思想+计算机的语言吗,那些C、C++、Java、C#、PHP等等各种计算机语言都是人类一种对计算机的抽象思维的具象表达。而且,过分地关注那些表面的东西很容易让我们变得浮躁从而无法接近事物的真相。

JavaScript中的对象表示方法
   JavaScript中,常用的对象表示方法有两种,一种是比较熟悉的new,还有一个就是JSON。想必new一个对象大家伙是很在行的,比如在上面的例子中,我们就是通过new关键字来创建一个dog对象的。
    这里着重讲另外一种很有用的对象表示法——JSON,其英语全称是JavaScript Object Notation,也即JavaScript对象表示法。JSON是一种轻量级的数据交换语言,是对象的一种序列化表示形式,简洁而明了,而JSON字符串是通过eval引擎转化为JS对象的。它的基本格式是:
      var object = {
       property1: pro1, // 属性1
       property2: pro2, // 属性2
       function1: fun1, // 函数1
       function2: fun2 // 函数2
     };
   当然,我们还可以嵌套使用这种对象定义方式:
     var object1 = {
       property1: pro1,
       function1: fun1,
       object2: {property2: pro2, function2: fun2}; //  嵌套定义
     };
   这种JS对象声明方法相对来说比较易懂清晰。但是也有一个缺点:缺乏灵活性。这也算是JSON的美中不足之处吧。

JavaScript的面向对象特性
   首先声明,我也是接触JavaScript才知道面向对象编程还分为两种:基于类的面向对象编程和基于原型的面向对象编程。像Java、C#这种属于基于类的面向对象语言,而JavaScript则属于基于原型的面向对象语言。
    基于类的面向对象语言包括两个基本概念:类和实例。类是一个很抽象的概念,简单说是具有相同属性和近似功能的事物的一种归约。而实例就是类的一个特例,即类的一个具体对象。而在基于原型的面向对象语言中,只有一个概念,那就是对象,它还有一个很重要的概念——原型对象。
    原型的概念需要重点强调。原型这个概念,相信大家接触过,以前学习语文课本中的小说时,经常会说主人公是以谁谁谁为原型的,小说的主人公B是以现实中A为原型,那么就说明B具有A的一些性格或经历。其实,从语义上,这两个原型是相通的,只是JavaScript原型得更彻底,JavaScript中,如果A是B的原型,那么B将具有A的所有属性和方法。JavaScript中的每一个对象都拥有一个原型对象作为参照对象,而且每一个函数有一个prototype属性,然后通过该属性引用原型对象。其实,原型对象就是一个对象模板。原型对象相对于类进行实例化具有一个很明显的优势——节省内存开销,我们知道,我们在用类实例化一个对象时,不管你用不用某个属性,它总是存在的,而当通过使用prototype,我们并不会在创建一个对象时将属性和方法附加在对象上,而是在对象调用某个属性或方法时,再去检测该对象是否具有所调用的属性或方法。
    一般地,基于类的面向对象语言都具有三大特点:继承、封装以及多态。这些特征相信接触过Java或C++等面向对象语言的读者应该很清楚,不少人甚至将这些作为判断一种编程语言是否是面向对象语言的标准,但是这些仅仅是基于类的面向对象语言的特征而已,在JavaScript中,这三者只有继承独活于世了。没有类,怎么实现继承?我想,我们是时候突破类的限制了,n年前,我们的祖先的祖先类人猿正是因为突破了类的限制——直立行走,才让今天的我们可以淡定地取笑着敲代码的程序猿。没有类,我们还有原型不是吗?是的,我们就是通过原型链接来实现JavaScript中的继承的。先看看下面的代码吧:
      // 定义一个Animal
     function Animal(){
       this.name= "";
       this.age = "";
     } // end Animal
     // 定义一个Dog
     function Dog(){
     this.bark = "Wowwow";
     } // end Dog
     // 通过原型实现继承
     Dog.prototype = new Animal();
     // 创建一个Dog对象
     var dog = new Dog();
     // 打印dog对象具有的属性
     for(var obj in dog){
     document.write("属性:", obj);
     } // end for
   这段代码的运行结果是:
     name
     age
     bark
   Dog通过原型从Animal那里继承了Animal的两个属性,看看,这不也是继承吗?当然,方法也是可以继承的。这就是JavaScript的继承,相信理解了这个,也就不难明白为什么JavaScript也是面向对象语言了。

   希望通过以上的阐述,大家已经对JS的面向对象特性以及JS的一些特点有了一些理解。理解了JS的一些基本真相,对于JS的深入学习相信也是大有裨益的。由于本人能力有限,文中难免会有疏漏之处,望大家不吝指正,在此先行谢过了。
分享到:
评论

相关推荐

    C++教程电子书籍URL

    - **简介**: 重点讲解面向对象编程的基础理论与实践技巧,是学习C++OOP不可或缺的参考资料。 #### 7. **《C++ Primer》** - **链接**: [http://bbs.topsage.com/dispbbs.asp?boardID=121&ID=145858]...

    p3c-pmd-2.0.0.jar

    rulesets/java/ali-exception.xml,rulesets/java/ali-flowcontrol.xml,rulesets/java/ali-naming.xml,rulesets/java/ali-oop.xml,rulesets/java/ali-other.xml,rulesets/java/ali-set.xml -f text

    最简单的PHP MVC留言本实例

    经过一番搜索,找到了一篇翻译文章(作者:Harry Fuecks 翻译:Easy Chen URL:http://www.21ds.net/article/4/453 原文URL:http://www.phppatterns.com/docs/ ... _controller_pattern)作者以商品目录浏览为例,...

    Visual JS

    Visual JS 是一个类似于 VB 的完全开源 JavaScript、Ajax、RIA 开发工具,Visual JS 本身就是由 Visual JS 开发出来的。 特点: 1. 支持SPA,快速建立Ajax RIA 应用; 2. 用拖拽的方式建立复杂JavaScript...

    JAVASCRIPT OOP -- 参考资料

    NULL 博文链接:https://orange5458.iteye.com/blog/1387988

    HDFS上传文件报错org.apache.hadoop.fs.ChecksumException: Checksum error: file:/hyk/data/hyk.txt

    当从本地上传文件到HDFS中时报错 fs.FSInputChecker: Found checksum error: b[0, 69]=6d6f77656968616861686168616868616686168616861686861680a org.apache.hadoop.fs.ChecksumException: Checksum error: file:/...

    OOP设计的一套比较好的架构

    一套好的delphi源代码,全部采用OOP设计思想。- Delphi 4 - www.borland.com - non free- Delphi 4 update 2 e 3 - www.borland.com - non free- BDE 5.01 - www.borland.com - free- ReportBuilder 5.53 - ...

    oop面向对象编程之打飞机游戏源码

    面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它基于“对象”的概念,将数据和操作数据的方法封装在一起。在打飞机游戏中,我们可以看到OOP的广泛应用,通过创建不同的对象来模拟游戏中的...

    运行Sqoop出现hcatalog does not exist!…accumulo does not exist!解决方案

    有一段时间没用sqoop了,今天打开进行测试的时候,发现命令行总是出现下面这样的警示信息: Warning: /opt/module/sqoop/bin/…/…/hcatalog does not exist! HCatalog jobs will fail. Please set $HCAT_HOME to ...

    关于JAVA资料整理

    - **链接二:** [http://dl1.itcast.net/course/detail/1013](http://dl1.itcast.net/course/detail/1013) —— 此链接为一个面向对象编程(OOP)的进阶课程。在这里,学员可以深入学习类与对象的概念、封装、继承和...

    计算机面试基础知识:算法、数据库、网络、操作系统、面向对象

    主要内容包括:Java、Git、OOP面向对象、Linux和操作系统、算法(Leetcode和剑指offer)、数据库(mysql、redis、sql语法、数据库系统原理)、网络(Http、socket、计算机网络)等方面的知识,对原本庞杂的知识体系...

    myeclipse7.0注册码

    1. **JavaScript Tools**: 提供了更加强大的JavaScript支持,包括JSDT集成、JavaScript闭包/OOP支持等。 2. **编辑增强**: 改进了代码编辑器的功能,提高了编程效率。 3. **代码浏览**: 增强了代码导航功能,便于...

    Vali-IT-repo

    简介: : 变量,条件语句: : 字符串,功能: : 控制台,阵列,循环: : 对象: : GIT : : //drive.google.com/file/d/1zOdxrJ2-oZfzfcaYi1Zg384GVY5gtN9V/view usp = sharing Json,REST,网络: https : //...

    Yii Blog Book.pdf

    在《Yii Blog Book.pdf》这份资料中,作者通过一个实战项目——使用Yii框架搭建博客系统的过程,详细介绍了Yii的基本用法及其在实际项目开发中的应用技巧。对于初学者而言,这份资料不仅是一份很好的学习材料,还能...

    Java编写 航班信息查询管理系统

    # OOP(机试) 本程序总结文章:http://blog.qiji.tech/?p=10344 - - - ## 程序基本要求 一、项目名称: Air Infomation Programming 基于控制台的航班信息程序,简称AIP 二、具体要求如下: (1)显示航班...

    oop-xp1.zip_11oop. com

    面向对象编程(Object-Oriented Programming,简称OOP)是一种流行的编程范式,它基于“对象”的概念,强调数据和操作数据的方法结合在一起。在这个"oop-xp1.zip_11oop.com"压缩包中,我们可以看到一个用OOP思想开发...

    Yii Blog Book

    - **OOP基础**:面向对象编程的基本概念,如类、对象、继承、封装等。 - **数据库编程**:SQL语言的基础,如数据表的创建、查询、更新等操作。 - **Yii文档阅读**:深入理解Yii框架的官方文档和API手册,以便更好地...

Global site tag (gtag.js) - Google Analytics