zoukankan      html  css  js  c++  java
  • js 高级对象

    经过前段时间,学习《ajax完全自学手册》后,才知道javascript原来还可以这么写。

    学过java,c#,vb的都知道类的概念,而类具有继承、封装、多态等功能。而javascript它不是面向对象语言,它是解释性语言。

    但我们同样可以使用javascript来实现继承、多态。

    Java实现类,有多种方法。

     

    方法一:构造方法。

    function coder()
    {
    this.name =
    ”小王”;
    this.job =
    ”程序员”;
    this.coding = function
    ()
    {
    alert(“我正在写代码”);
    }
    }
    Exam:
    var coder=new
    coder();
    Alert(coder.name);
    Coder.coding();

     

     

    方法二:工厂方法。

    代码
    function createCoderFactory()
    {
    var
    obj;
    obj.name
    =
    “小王”;
    obj.job
    =
    “程序员”;
    obj.coding
    = function
    ()
    {
    alert(“我正在写代码”);
    }
    }
    Exam:
    var coder =
    createCoderFactory();
    alert(coder.name);
    coder.coding();

     

    但工厂方法和构造方法都有着一个相同的缺点,就是每创建一个实例,都会实例化该类的每个函数。如:

    var coder1 = new coder();
    var coder2 = new
    coder();
    alert(coder1.name);
    //显示“小王”

    coder2.name = “老王”;
    alert(coder1.name);
    //显示“老王”

    alert(coder2.name); //这个也显示“老王”

     

     

    方法三:原形链。

    代码
    function coder()
    {}

    coder.prototype.name
    =
    “小王”;
    coder.prototype.job
    =
    “程序员”;
    coder.prototype.coding
    = function
    ()
    {
    alert(“我正在写代码”);
    }
    Exam:
    var coder = new
    coder();
    alert(coder.name);
    coder.coding();

     

    方法四:混合方式。

    function coder()
    {
    This.name
    =
    “小王”;l
    This.job
    =
    “程序员”;
    }
    coder.prototype.coding
    = function
    ()
    {
    alert(“我正在写代码”);
    }

    以上三种都有着各自的缺点,所以我们要加以改进。

     

    方法五:动态原链。

    要解决前三种的缺点,还有一种方法。

    代码
    function coder()
    {
    this.name =
    “小王”;
    this.job =
    “程序员”;
    if (typeof(coder._init) ==
    “undefined”)
    {
    coder.coding
    = function
    ()
    {
    alert(“我正在写代码”);
    }
    coder._init
    = true
    ;
    }
    }

     这个方法呢,当第一次使用时,由于coder._init没定义,就会执行以下的代码,实例化函数。以后就不会在执行,这样就只实例话函数一次。

     

     

    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

    在JS中,创建对象(Create Object)并不完全是我们时常说的创建类对象,JS中的对象强调的是一种复合类型,JS中创建对象及对对象的访问是极其灵活的。

    JS对象是一种复合类型,它允许你通过变量名存储和访问,换一种思路,对象是一个无序的属性集合,集合中的每一项都由名称和值组成(听起来是不是很像我们常听说的HASH表、字典、健/值对?),而其中的值类型可能是内置类型(如number,string),也可能是对象。

    一、由一对大括号括起来

         var emptyObj = {};
        
    var myObj =
        {
            
    'id'1,        //属性名用引号括起来,属性间由逗号隔开
            'name''myName'
        };
        
    //var m = new myObj(); //不支持
     
      不知你注意到对象都是用 var 声明的没有,像上面的代码,就只是简单的声明一个对象,它只有一份拷贝,你不能像实例化类对象一样对它采用new操作,像上面代码的注释部分。这样就极大的限制了对象的重用,除非你建立的对象只需要一份拷贝,否则考虑用其他方法建立对象。
      下面一起看看如何访问对象的属性和方法。
         var myObj =
        {
            
    'id'1,
            
    'fun'function() {
                document.writeln(
    this.id + '-' + this.name);//以"对象.属性"方式访问
            },
            
    'name''myObj',
            
    'fun1'function() {
                document.writeln(
    this['id'+ '+' + this['name']);//以集合方式访问
            }
        };
        myObj.fun();
        myObj.fun1();
        
    // 结果
        // 1-myObj 1+myObj 
    二、用 function 关键字模拟 class
    在 function 中用 this 引用当前对象,通过对属性的赋值来声明属性。如果用var声明变量,则该变量为局部变量,只允许在类定义中调用。
             function myClass() {
                
    this.id = 5;
                
    this.name = 'myclass';
                
    this.getName = function() {
                    
    return this.name;
                }
            }
            
    var my = new myClass();
            alert(my.id);
            alert(my.getName());
            
    // 结果
            // 5
            // myclass
    三、在函数体中创建一个对象,声明其属性再返回
    在函数体中创建对象可利用第一点的方法,或先 new Object(); 再为各属性赋值。
    不过用这种方式创建的对象在VS2008 SP1中是没有智能提示的。
             function myClass() {
                
    var obj =
                {
                    
    'id':2,
                    
    'name':'myclass'
                };
                
    return obj;
            }
            
    function _myClass() {
                
    var obj = new Object();
                obj.id 
    = 1;
                obj.name 
    = '_myclass';
                
    return obj;
            }
            
    var my = new myClass();
            
    var _my = new _myClass();
            alert(my.id);
            alert(my.name);
            alert(_my.id);
            alert(_my.name);

            
    // 结果
            // 2
            // myclass
            // 1
            // _myclass
    0  
    0  
    0 
  • 相关阅读:
    跃迁方法论 Continuous practice
    EPI online zoom session 面试算法基础知识直播分享
    台州 OJ 2648 小希的迷宫
    洛谷 P1074 靶形数独
    洛谷 P1433 DP 状态压缩
    台州 OJ FatMouse and Cheese 深搜 记忆化搜索
    台州 OJ 2676 Tree of Tree 树状 DP
    台州 OJ 2537 Charlie's Change 多重背包 二进制优化 路径记录
    台州 OJ 2378 Tug of War
    台州 OJ 2850 Key Task BFS
  • 原文地址:https://www.cnblogs.com/xcj26/p/1679860.html
Copyright © 2011-2022 走看看