• 面向对象编程(一)


    本博客是根据个人的理解,来写面向对象编程的,严格意义上来说,javascript实际上是面向原型编程。暂且以大众意义上的说法来学吧,对于这个系列的教程我看了很多,每次看,都把上次看的几乎忘光了,归根到底,是真的没能理解这个,每次看完都像自己理解学会了,其实都没有,看了很多遍,也有自己的领悟,我决定把这个我自己的理解写在博客里。----FaithJin

    尊重知识产权,本教程学习自 ruanyifeng.com教程上,我个人很喜欢阮一峰写的文章,扎实有深度,值得学习。

    1.1 构造函数

      典型的面向对象编程,如(java),都会有个类(class), 然后每个对象 就是类(class)的实例,但是在javascript的世界中,没有类(class)这个概念,而改用构造函数(constructor)作为对象的模板。

    eg: 构造函数(constructor)

    function person(name, age) {  
            this.name = name;  
            this.age = age;  
    } 

    构造函数跟普通函数不一样,最大的不同是,函数体内部使用了this关键字,代表了要生成对象的实例。生成对象的时候必须使用new 命令。

    1.2 new命令

    function Person(){
            this.name = "faithJin";
    }
    var p = new  Person();
    p.name;//faithJin

    上面的代码,通过new命令,生成一个Person的实例p,继承Person的name属性。

    在new执行的过程中,构造函数的内部this,代表的是新生成实例对象p。

    如果我们在调用的时候,忘记了new 命令,直接 var p = Person(),我们修改一下构造函数 ,使其可以带一个参数--出现了意想不到的错误,这时的this指向的是全局对象,而且不会生成实例。

    function Person(name){
            this.name = name;
    }
    var p =   Person("faithJin");
     p.name;//Cannot read property 'name' of undefined

    为了保证构造函数与new命令一起使用,在构造函数内部,使用严格模式。

    function Person(name){
            "use strict"
            this.name = name;
    }
    Person("faithJin");//TypeError: Cannot set property 'name' of undefined

    由于在严格模式中"use strict",函数内部的this不能指向全局对象,默认等于undefined,导致不加new调用会报错(JavaScript不允许对undefined添加属性)。

    1.3instanceof 运算符

    ---未完待续//2014/7/15 update

    instanceof 用来判断某个对象是否是某个构造函数的实例:

    var p = new Person();

    p instanceof Person;//true

    利用instanceof 运算符,我们还可以解决上面提到的问题,忘记new命令的问题。

        function Person (name,age){
            if (this instanceof Person){
                this.name = name;
                this.age =age;
            }else{
                return new Person(name, age);
            }
        }

    上面代码如果是false,表明忘记new 命令了。

    1.4 call

        function person(name, age) {  
            this.name = name;  
            this.age = age;  
        }  
      
        //student类,继承自person(call)  
        function student(name, age, no) {  
            person.call(this, name, age);  
            this.no = no;  
        }  
        var s = new student("jin",23,"abcd");
        console.log(s.name);//name属性通过call来继承person中的name属性

    func.call(thisvalue,arg1,arg2,..)第一个参数就是this所指向的对象,如果this所要指向的对象设置为null 或者 defined,则等于指向全局对象。

    1.5 apply

    apply方法与call方法作用类似,唯一的qU区别就是参数func.call(thisvalue,[arg1,arg2,..]),看到区别了吗,后面的参数是个数组,不在赘述。

    但是这里有三个常用的例子可以说明下,apply还是有其存在的价值的。

    1.找出数组的最大数

       我们知道Math.max(1,2,3,4,5)这样就能得出最大数,但是数组呢,js没有提供这样的方法,apply可以帮我们搞定

    var a = [1, 2, 3, 4, 5];
    
    Math.max.apply( null, a);//try it
  • 相关阅读:
    VCalendar
    xls和xlsx的区别
    alioss的常见问题
    别再写 shǐ 山代码了。。。
    一款高颜值的 MySQL 管理工具,超好用。。
    Spring Boot Admin 横空出世!
    Redis 官方可视化工具,功能真心强大。。。
    Nginx 从安装到高可用,一篇搞定,99% 的人都收藏了。。
    duobule 转 int 问题
    mysql慢sql查询
  • 原文地址:https://www.cnblogs.com/jine/p/3843817.html
Copyright © 2020-2023  润新知