《javascript设计模式与开放实践》学习(一)javascript实现多态2

 1、this的使用

1)作为对象的方法调用,this指的对象本身

var obj={
  a:1,
   getA:function(){
         alert(this===obj);//输出:true
         alert(this.a); //输出:1
   }  
}
obj.getA();

 2)作为普通函数调用,this指的是window对象

window.name='globalName';

var myObject={
    name:'seven',
    getName:function(){
        return this.name;  
    }
};

var getName=myObject.getName;
console.log(getName()); //输出globalName

 这里是变量getName引用myObject.getName方法。如果是myObject.getName(),会输出seven,这里是属于对象的属性调用。

3)构造器调用,this指的是构造器返回的对象

var MyClass=function(){
    this.name='seven';
};

var obj=new MyClass();
alert(obj.name);

如果显式的返回Object对象,最终返回这个对象,而不是this

var MyClass=function(){
        this.name='seven';
        return {
            name:'anne'
        }
    };

    var obj=new MyClass();
    alert(obj.name);//输出anne

如果返回的是非对象类型,如字符串,依然会输出seven.

4)Function.prototype.call或Function.prototype.apply调用

都用于用于指定函数内this对象的指向.

call与apply区别:

a)apply的第一个参数指定this对象的指向,第二个参数为一个带下标的集合,可以是数组也可以是类数组。

var func=function(a,b,c){
   alert([a,b,c]);//输出[1,2,3]
};
func.applay(null,[1,2,3]); //null指向默认的宿主对象,浏览器中为window.

b)call的一个参数和apply一样指定this对象,后面多个参数。

var func=function(a,b,c){
   alert([a,b,c]);//输出[1,2,3]
};
func.call(null,1,2,3); //null指向默认的宿主对象,浏览器中为window.

解决上面用普通函数调用this丢失的问题

window.name='globalName';

    var myObject={
        name:'seven',
        getName:(function(){
            return this.name;
        })
    };

    var getName=myObject.getName;
    console.log(getName.apply(myObject)); //输出seven
原文地址:https://www.cnblogs.com/GallopingSnail/p/5869315.html