zoukankan      html  css  js  c++  java
  • JavaScript 面向对象编程实现

    最近在捉时间,对JavaScript高级程序设计进行叫系统的补强学习。
    经过几天的学习,今天特意整理了JavaScript的面向对象的编程实现,也是一个基本问题:怎样建立对象?

    其实写过Js代码的人,也已经涉及到对象的建立了,我们使用的其实是一种被称为JavaScript Object Notation(缩写 JSON)的形式,翻译为中文就是“JavaScript对象表示法"。
    JSON为创建对象提供了非常简便的方法。例如,
    1).创建一个没有任何属性的对象:
    var o={};
    2).创建一个对象并设置属性及初始值:
    1var person = {
    2          name: "Angel"
    3          age: 18
    4          married: false
    5          }
    ;
    3) . 创建一个对象并设置属性和方法:
    1var speaker = 
    2{
    3text: "Hello World",
    4 say: function()
    5       {
    6         alert(this.text);
    7       }

    8}
    ;

    4).创建一个更复杂的对象,嵌套其他对象和对象数组等:
     1var company =
     2{
     3name: "Microsoft",
     4
     5product: "softwares",
     6
     7chairman: {name: "Bill Gates", age: 53, Married: true},
     8
     9employees: [{name: "Angel", age: 26, Married: false}{name: "Hanson", age: 32, Marred: true}],
    10
    11readme: function() {document.write(this.name + " product " + this.product);}
    12}
    ;

    总结:
        JSON 的形式就是用大括“{}”号包括起来的项目列表,每一个项目间并用逗号“,”分隔,而项目就是用冒号“:”分隔的属性名和属性值。这是典型的字典表示形式,也再次表明了 JavaScript 里的对象就是字典结构。不管多么复杂的对象,都可以被一句JSON 代码来创建并赋值。
        其实,JSON 就是JavaScript 对象最好的序列化形式,它比XML 更简洁也更省空间。对象可以作为一个JSON 形式的字符串,在网络间自由传递和交换信息。而当需要将这个JSON 字符串变成一个JavaScript 对象时,只需要使用eval 函数这个强大的数码转换引擎,就立即能得到一个JavaScript 内存对象。正是由于JSON 的这种简单朴素的天生丽质,才使得她在AJAX 舞台上成为璀璨夺目的明星。

    JavaScript 就是这样,把面向对象那些看似复杂的东西,用及其简洁的形式表达出来。卸下对象浮华的浓妆,还对象一个眉目清晰!

    类的声明:
    理解了JSON构建对象的形式,那么我们下面来用另一种形式声明一个类,并构建对象:
    思想:在JavaScript 中我们可以使用new 操作符结合一个函数的形式来创建对象
     1function ClassA() //构造函数不带参数
     2{
     3   var _privateProp = "privateProp"// 通过var关键字声明一个局部变量,其作用域是该类的内部不对外公开;
     4   this.p1 = "p1";
     5   this.p2 = "p2";
     6   this.f1 = function(){  // f1 方法
     7      alert("I am f1!");
     8   }

     9   this.f2 = function(){  // f2 方法
    10      alert("I am f2!");
    11   }

    12}

    13


    其实,如果你愿意把函数当作“类”的话,她就是“类”,因为她本来就有“类”的那些特征。难道不是吗?她生出的儿子各个都有相同的特征,而且构造函数也与类同名嘛!

    利用prototype属性还可以实现另外一种类的声明方式:

     1function ClassA() {}
     2
     3ClassA.prototype = {
     4   p1 : "p1";
     5   p2 : "p2";
     6   f1 : function() {
     7      alert("f1");
     8   }

     9   f2 : function() {
    10      alert("f2");
    11   }
      
    12}

    上面这种方式使用{} 的方式声明了一个匿名对象,大括号内用逗号将属性与值得列表分隔开。
    可以看到,采用prototype的方式声明类,代码更加简洁明了,因此这种方式在许多Ajax开发框架中得到广泛的应用。
    如:prototype框架,Dojo框架。

    接下来我们来看一下 继承,即如何来实现继承?
    注意:JavaScript语言本身并没有提供对于继承的语法的支持,但是仍然可以采用复制属性和对象的方式来实现继承。
    下面是实现继承最直接的方式:(构建一个新的类SubClassA 去继承ClassA所有的东西,同时新设置一方法newMethod)
     1function ClassA() {}
     2
     3ClassA.prototype = {
     4   p1 : "p1";
     5   p2 : "p2";
     6   f1 : function() {
     7      alert("f1");
     8   }

     9   f2 : function() {
    10      alert("f2");
    11   }
      
             newMethod : function()
            {
                   alert("newMethod");
            }
    12}

    虽然这种实现方式表面上解决了问题(其实我并认为这是继承机制的概念),但是两个类声明中的代码重复书写是一个很大的隐患,因为如果ClassA类的定义改变了,那么SubClassA类也要同步进行手工修改,显然不是那么回事的。
    解决方案可以这样,我们可以利用for(... in ...)语句,遍历ClassA类的所有属性和方法,将其"复制"到新声明的SunClassA类中。上面代码修改后如下:
     1function SubClassA() {}
     2
     3for(p in ClassA.prototype)
     4{
     5   SubClassA.protopyte[p] = ClassA.prototype[p];
     6}

     7SubClassA.prototype.newMethod = function(){
     8   alert("new Method!");
     9}

    10

    SubClassA类的声明中,首先通过for(... in ...)语句将ClassA的所有原型属性和方法复制到SubClassA的prototype属性中,然后声明一个新的原型方法newMethod。
    结束语
    下次介绍常见的Ajax框架中的面向对象编程(Prototype/Dojo)
  • 相关阅读:
    GenericServlet vs HttpServlet
    il c井
    额。。万恶之源就是c
    js算数优先级
    connect-flash 中间件
    触发bfd 的条件
    module 和 module.exports 的区别
    a标签填充父容器
    bootstrap
    每日一练排版
  • 原文地址:https://www.cnblogs.com/Dlonghow/p/1235705.html
Copyright © 2011-2022 走看看