美文网首页
javascript中function(){}(),new fu

javascript中function(){}(),new fu

作者: 大水啊大水 | 来源:发表于2017-03-01 20:05 被阅读65次

    javascript中function(){}(),new function(),new Function(),Function

    通过function构造类时this的指向

    如果function被构造为一个类,那么必然存在该类被实例化的一个过程,如果没有实例化,那么该类实际上并没有在程序中被使用。而一旦实例化,那么this将指向实例化的对象。

    var age = 3;
    var cat1 = new function() {
        this.name = 'Tom';
        this.age = 2;
        this.weight = function(age) {
            var age = age * 2;
            var _age = this.age * 2;
            return 'weight by age:' + age + '; weight by this.age:' + _age;
        }(this.age);
        this.eye = new function() {
            this.size = '1.5cm';
            this.color = 'red';
        };
        this.catching = function(mouse) {
            return this.name + ' is catching ' + mouse;
        };
    };
    alert(cat1.weight);
    alert(cat1.eye.color);
    alert(cat1.catching('Jerry'));
    

    根据我们的原则,this指向实例化对象,我们来对每一个this进行分解。

    首先是cat1.weight,我使用了function(){}(),直接利用猫咪的年龄进行计算得出体重返回给weight属性。

    第一个this.age出现在function(){}(this.age),这个this.age实际上是一个传值过程,如果你对我之前分析function(){}()比较了解的话,应该知道,this.age实际上是和前面this.age = 2指同一个,这里的this.age的this,首先要去找它所在的function,然后看这个function是否被实例化,最后确认,确实被实例化为cat1,因此this=cat1。

    第二个this.age出现在function(){this.age}()。同样,你先需要对function(){}()再次深入了解,实际上,function(){}()就是执行一个函数而已,我们前面提到了,普通函数执行中this=window,所以,这里的this.age实际上是var age = 3。

    第三个this.color出现在new function(){this.color},这里就比较好玩,由于有一个new,实际上也被实例化了,只不过是对匿名类的实例化,没有类名,而且实例化仅可能出现这一次。因此,this.color的this要去找new function的主人,也就是this.eye,而this.eye的this=cat1,所以cat1.eye.color='red'。

    第四个this.name出现在function(){this.name},它出现在cacthing方法中,它既不是普通的函数执行,也不是实例化为对象,而是正常的类中的方法的声明,因此this指向要去找它所在的function被实例化的对象,也就是cat1。

    相关文章

      网友评论

          本文标题:javascript中function(){}(),new fu

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