美文网首页
恶补Javesrcipt面向对象(一)

恶补Javesrcipt面向对象(一)

作者: 布拉德澈 | 来源:发表于2018-10-07 17:22 被阅读0次

    第一部分:Javascript面向对象基础

    一、用定义函数的方式定义类:

    在OOP的思想中,类是一个很重要的元素,一个类表示了具有相似的一类事物的抽象,通过实例化一个类,可以获得属于该类的一个实例,即对象。
    在javascript中,我们定义一个函数,也可以看着是类。

     function class(){
       code;    //类成员的定义以及构造函数       
     }
    

    上面class我们可以将他看着为类的构造函数,来实现初始化工作。
    JS中暂时没有CLASS这个类的关键字,所以我们暂时使用function来实现类的定义。(es6已经有class关键字)
    类在定义好之后,如果没有定义静态方法时,我们是不能直接使用的,我们需要先实例化一个类。
    当然,JS也不例外的使用new这个关键字来实现对类的实例化。

    // demo.js
    function Test() {
        alert('hello,js');
    }
    
    // demo.html
        <script src="../oop/demo.js"></script>
        <script>
            function testFunc(){
                let test = new Test();
                alert(typeof (test));
            }
        </script>
    <body>
    <h1>Javascript Oop Demo</h1>
    <button value="test" onclick="testFunc()">查看调用结果
    </button>
    </body>
    
    image.png
    image.png

    我们可以这么简单的理解,在javascript中,函数和类是就是一个概念。
    当对一个函数进行new操作是,就返回一个对象,如果函数中没有初始化类成员,就会返回一个空对象。
    当 new一个函数时,这个函数就代表类的构造函数,其中的代码被看做初始化了一个对象。
    用于表示类的函数我们也称之为构造器。

    二、引用对象的属性和方法

    在JAVASCRIPT中,每个对象可以看做是多个属性(方法)的集合,引用一个属性(方法)一般采用 :
    对象名.属性(方法)名 对象名["属性(方法)名"]
    例如:

    var arr = new Array();    //定义一个数组
    arr.push('xiaozu');         //为数组增加一个元素
    arr["push"]("zhangsn");    //使用[]引用对象的属性和方法
    
    var $length = arr.length;    //获取数组长度
    var $len = arr["length"];    //获取数组长度
    
    document.write($length+"<br>");
    document.write($len);
    

    我们做个下拉菜单的案例:

        <script>
            //定义一个User类,包含两个成员,并指定初始值
            function User(){
                this.age = 21;
                this.sex='male';
            }
            //实例化user对象
            let user = new User();
            //根据下拉列表框显示用户信息
            function show(slt) {
                if(slt.selectedIndex!=0){
                    alert(user[slt.value]);
                }
            }
        </script>
    </head>
    <body>
    <!--下拉列表框用于选择用户信息--->
    <select onchange="show(this)">
        <option>请选择需要查看的信息:</option>
        <option value="age">年龄</option>
        <option value="sex">性别</option>
    </select>
    </body>
    

    这段代码,使用一个下拉列表框让用户选择查看哪个信息,每个选项的value就表示用户对象的属性名称。

    三、动态添加、修改、删除对象的属性和方法

    上面,我们已经了解如何引用一个对象的属性和方法,现在我们来了解如何为一个对象添加、修改或则删除属性和方法。
    Javascript提供了灵活的机制来修改对象行为,可以动态添加、修改、删除属性和方法。
    例如,我们先用类Object来创建一个空对象user:

    // 添加属性和方法:
    var user = new Object();  //创建一个空对象user
    
    user.name = 'xiaozu';  //添加属性
    user.age = '18';
    user.sex = 'male';
    
    document.write(user.name+"<br />");  //输出这三个语句
    document.write(user.age+"<br />");
    document.write(user.sex+"<br />");
    
     user.getName =function(){  //添加一个方法
                document.write("My name is:"+this.name+"<br/>");
            }
    
    user.getName();   //调用这个方法
    

    修改属性和方法:
      修改一个属性和方法的过程就是用新的属性替换旧的属性
    删除属性和方法:
      删除一个属性和方法就是讲其设置为undefined。

    user.name = undefined;
    user.alert = undefined;
    

    也可以使用 delete user.name 来删除一个属性。

    四、 创建无类型对象

    JavaScript中的对象其实就是属性(方法)的一个集合,并没有严格意义上的类的概念。
    它提供了一种简单的方式来创建对象,通过使用大括号括住多个属性或方法及其定义(这些属性或方法用逗号隔开),来实现对象的定义。
    这段代码就直接定义了具有N个属性或方法的对象,其中属性名和其定义之间用冒号(:)隔开。

        var $obj = {};          //定义个空对象
        var $user={
             //定义了name属性,初始化为xiaozu
              $name:"xiaozu",     
              //定义了sex属性,初始化为male
              $sex:"male",        
               //定义hello方法
              hello:function(){   
                  document.write("hello,"+this.$name);
              }
        }
       //调用user对象的方法hello
        $user.hello();
    

    五、prototype原型对象

    是实现面向对象的一个重要机制。
    每个函数(function)其实也是一个对象,他们对应的类是“Function”。
    每个函数对象都具有一个子对象prototype。
    即prototype表示该函数的原型,而函数也是类。
    prototype就是表示了一个类的成员的集合。
    当通过new来获取一个类的对象时,prototype对象的成员都会成为实例化对象的成员。

    function $class1(){
                //empty
            }
    $class1.prototype.method=function(){   
     //对类的prototype对象进行修改,增加method方法
                alert("it is a test method");
            }
    //创建类$class1的实例
     var $obj1 = new $class1();             
    //调用$ogj1的方法method
     $obj1.method();                        
    

    第二部分、深入认识Javascript中的函数

    一、概述:

    函数是进行模块化程序设计的基础, javascript重的的函数不同于其他语言,每个函数都作为一个对象被维护和运行。通过函数对象的性质,可以很方便的将一个函数赋值给一个变量或则讲函数作为参数传递。

    二、认识javascript中的函数

    javascript可以用function关键字定义一个函数,并为每个函数指定一个函数名,通过函数名来调用。
    在javascript解释执行时,函数都是被维护为一个对象,这就是函数对象(Function Object).
    函数对象与其他用户所定义的对象有着本质的区别,这一类对象被称之为内部对象。
    例如:日期对象(Date)、数组对象(Array)、字符串对象(String)都属于内部对象。
    这些内置对象的构造器是由JavaScripy本身所定义的,通过执行Array()这样的语句返回一个对象,javascript内部有一个套机制来初始化返回的对象,而不是由用户来指定对象的构造方式。
    在javascript中,函数对象对应的类型是Function,正如数组对象对应的是Array,日期对象对应的类型是Date一样,可以通过new Function()来创建一个函数对象,也可以通过function关键字来创建一个对象。

     function myfunction($a,$b) {      //传统写法
         var $res = $a + $b;
         document.write($res);
         return $res;
    }
    

    我们采用另外一种写法:

    var $myfunction = new Function("$a","$b","var $res=$a+$b;document.write($res);return $res;")
    </script>
    
    <body>
        <h1>测试</h1>
        <button onclick="$myfunction(5,12)">JS测试</button>
    </body>
    
    var funcName = new Function(p1,p2,......,pn.body);
    

    参数的类型都是字符串,p1到pn表示所创建函数的参数名称列表,body表示所创建函数的函数体语句,funcName就是所创建函数的名称。
    可以不指定任何参数创建一个空函数,不指定funcName创建一个无名函数,当然那样的函数没有任何意义。
    需要注意的是,p1到pn是参数名称的列表, p1不仅代表一个参数,它也可以是一个逗号隔开的参数列表。
    javascript引入Function类型类型并提供new Function()这样的语法是因为函数对象添加属性和方法就必须借助于Function这个类型。
    函数本质是一个内部对象,由javascript解释器决定其运行方式,通过上述代码创建的函数,在程序重可以使用函数名进行调用。直接在函数声明后面加上括号就表示创建完成后立即进行函数调用。

    三、函数对象和其他内部对象的关系

    除了函数对象,还有很多内部对象,比如:Object、Array、Date、RegExp、Math、Error。
    这些名称实际上表示一个类型new操作符返回一个对象。然而函数对象和其他对象不同,当用typeof得到一个函数对象的类型时,它仍然会返回字符串‘function’,而typeof一个数组对象或其他的对象时,它会返回字符串'object'。
      尽管函数本身也是一个对象,但它与普通的对象还是有区别的,应为它同事也是对象构造器,也就是说,可以NEW一个函数来返回一个对象。
      Function是所有函数对象的基础,而Object是所有对象(包括函数对象)的基础。在javascript中,任何一个对象都是Object的实例。因此,可以修改Object这个类型来让所有对象具有一个写通用的属性和方法,修改Object类型是通过prototype来完成的。

    四、将函数对象作为参数传递

    每个函数都被表示为一个特殊的对象,可以方便的将其赋值给一个变量,再通过这个变量名进行函数调用。作为一个变量,它可以以参数的形式传递给另一个函数。

    function func1(theFunc){
      theFunc();     
    }
    function func2(){
      alert("good");
    }
    func1(func2);
    

    五、aguments

    当进行时函数调用时,出料指定的参数外,还创建了一个隐藏的对象arguments。arguments是一个类似数组但不是数组的对象。它具有数组一样的访问性质,可以用arguments[index]这样的语法取值,拥有数组长度属性length。arguments对象存储的是实际传递给函数的参数,而不局限于函数声明所定义的参数列表。

    function funName($a,$b){
        document.write($a+"<br />");
        document.write($b+"<br />");
        for(var $i=0;$i<arguments.length;$i++){
            document.write(arguments[$i]+"<br />");
        }
    }
    funName(2,4,6,8,10);
    

    arguments对象的另一个属性是callee,它表示对函数对象本身的引用,这有利于实现无名函数的递归或则保证函数的封装性。

    六、JavaScript中的this指针

    JavaScript可以使用this指针来获得该对象自身的引用。this指针是一个动态变量,一个方法内的this指针并不是始终指向定义该方法的对象。列如:

    //创建两个空对象
    var $obj1 = new Object();
    var $obj2 = new Object();
    //给两个对象都添加属性 att,分别等于1和2
    $obj1.att = 1;
    $obj2.att = 2;
    //给$obj1 新增一个方法,用来显示att的值
    $obj1.getAtt = function(){
      document.write(this.att);
    }
    $obj1.getAtt();
    
    //让$obj2的gerAtt方法等于$obj1的getAtt方法
    $obj2.getAtt = $obj1.getAtt;
    
    $obj2.getAtt();
    

    javascript中的this指针是一个动态变化的变量,表明了当前运行该函数的对象。一个对象就是由一个或多个属性(方法)组成的集合。每个集合元素不是仅仅属于一个集合,而是可以动态的属于多个集合。这样,一个方法(集合元素)由谁调用,this指针就指向谁。

    七、函数的apply、call方法的运用

    javascript为函数对象定义了两个方法:apply和call。他们的作用都是讲函数绑定到另外一个对象上去运行。

    Function.prototype.apply(thisArg.argArray);
    Function.prototype.call(thisArg[,arg1[,arg2...]]);
    

    相关文章

      网友评论

          本文标题:恶补Javesrcipt面向对象(一)

          本文链接:https://www.haomeiwen.com/subject/gbwlaftx.html