javascript之面向对象

来源:互联网 发布:mac dmg 沙盒 编辑:程序博客网 时间:2024/06/10 23:56

对象:

  1. 创建对象常用的两种方式,

    • 工厂模式:

      function creatObject(name,age){    var o   = new Object();    o.name  = name;    o.age   = age;    o.run   = function(){        return this.name +this.age+"run....";    }    return o;}var ob1 = creatObject('sdfas',11);alert(ob1.run());#工厂模式有一个问题,就是只能判断创建的对象是Object类型,其他则无法判断。
    • 构造函数模式:

    function Student(name,age) {    this.name   = name;    this.age    = age;    this.run    = function(){        return this.name + this.age+"run ....";    }}var s   = new Student('mmm',100);alert(s.run())#如果使用var s=Student('mmm',100),这种形式,则函数定义时,使用的this将指向全局对象window

    构造函数模式和工厂模式的区别:
    1.构造函数方法没有显示的创建对象(new Object());
    2.直接将属性和方法赋值给this 对象;
    3.没有renturn 语句。

    构造函数模式中对象的创建过程:
    1.当使用了构造函数,并且new 构造函数(),那么就后台执行了new Object();
    2.将构造函数的作用域给新对象,(即new Object()创建出的对象),而函数体内的this 就
    代表new Object()出来的对象。
    3.执行构造函数内的代码;
    4.返回新对象(后台直接返回)。

    注意:this 其实就是代表当前作用域对象的引用。如果在全局范围this 就代表window 对象,如果在构造函数体内,就代表当前的构造函数所声明的对象。

  2. call和apply方法
    call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向。因为 JavaScript 的函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念.

    二者的作用完全一样,只是接受参数的方式不太一样。
    例如,有一个函数 func1 定义如下:
    var func1 = function(arg1, arg2) {};
    就可以通过 func1.call(this, arg1, arg2); 或者 func1.apply(this, [arg1, arg2]); 来调用。其中 this 是你想指定的上下文,他可以任何一个 JavaScript 对象(JavaScript 中一切皆对象),call 需要把参数按顺序传递进去,而 apply 则是把参数放在数组里。

    JavaScript 中,某个函数的参数数量是不固定的,因此要说适用条件的话,当你的参数是明确知道数量时,用 call,而不确定的时候,用 apply,然后把参数 push 进数组传递进去。当参数数量不确定时,函数内部也可以通过 arguments 这个数组来便利所有的参数。

    此处引用自 作者:赵望野
    https://www.zhihu.com/question/20289071/answer/14745394

0 0