**

this、call和apply

**
使用 new运算符调用构造器(指的是构造函数)时,如果构造器显示的返回了一个 object 类型的对象, 那么此次运算的结果最终会返回这个对象,而不是我们之前期待的this。

        var MyClass = function() {
            this.name = 'kitty';
            return {
                name: 'tom'
            }
        }
        
        var obj = new MyClass();
        console.log(obj.name)   //输出:   tom

如果构造器不显示的返回任何数据,或者是返回一个非对象类型的数据,这样就不会存在问题了:

        var MyClass = function() {
            this.name = 'kitty';
            return   'tom';

        }
        
        var obj = new MyClass();
        console.log(obj.name)   //输出:   kitty  

call和 apply最常见的用途是改变函数内部的this指向:

    var obj1 = {
        name: 'one'
    };

    var obj2 = {
        name: 'two'
    };

    window.name = 'window';

    var getName = function () {
        console.log(this.name);
    };
    
    getName();              //输出   window
    getName.call(obj1);     //输出   one
    getName.call(obj2);     //输出   two

当执行getName.call(obj1) 这句代码时getName 内部this 就指向了 obj1对象, 也就是getName 内部的this.name 其实就是obj1.name so 输出 one;

实际开发中经常会遇到this指向不经意间改变

    document.getElementById('div1').onclick(function() {
        console.log(this.id);           //输出   div1
        var fnc = function() {
            console.log(this.id);       //输出   undefined
        }
        fnc();
    });

我们可以用call来给变函数 fnc 内部的this 指向

        document.getElementById('div1').onclick(function() {
	        console.log(this.id);           //输出   div1
	        var fnc = function() {
	            console.log(this.id);       //输出   undefined
	        }
	        fnc.call(this);
	    });

Q.E.D.