关于此关键字bests在javascript中使用

时间:2013-10-18 15:20:20

标签: javascript oop this

关于在javascript上使用“this”关键字,我有几个问题。


  1. this的持续使用会将整个函数对象重载到RAM内存中吗?
  2. 最好宣布

  3. MyClass = function(){ 
        this.name = "Petter";
        this.age = 12;
        this.toString = function(){
            return "Name: "+this.name + " Age: " + this.age;  
        }
    }
    

    而不是


    MyClass = function(){
        var _this = this;
        _this.name = "Petter";
        _this.age = 12;
        _this.toString = function(){
            return "Name: "+_this.name + " Age: " + _this.age;  
        }
    }
    

    或者你能向我推荐什么?

3 个答案:

答案 0 :(得分:2)

不,这不是真的,我从来没有听说过这样的事情。

你做的所有事情

var _this = this;

创建变量以指向使用this时引用的内存中的对象。不管你说:

this.name = "Petter";

_this.name = "Petter";

您仍在为同一个对象分配属性。引用该对象(_thisthis)的方式没有区别。

修改

当你想在另一个范围内使用this时,你经常需要获得对this的引用(作为一个很好的例子,我想到了setTimeout)。

    var MyClass = function() {
       setTimeout(function() { this.myMethod(); },100);
    };

    MyClass.prototype.myMethod = function() {
      console.log('hi there');
    }

    var myObject = new MyClass();

在上面的代码中,你会收到一个错误,因为当执行setTimeout函数时,它会在this === window的全局范围内执行,并且{{1}上没有函数myMethod()对象。

要纠正这个问题,你可以这样做:

window

即使您的setTimeout函数在全局范围内执行,变量 var MyClass = function() { var self = this; setTimeout(function() { self.myMethod(); },100); }; MyClass.prototype.myMethod = function() { console.log('hi there'); } var myObject = new MyClass(); 实际也指向self(或MyClass)的实例,因为您执行了this(因为JavaScript是lexically scoped

此外,这只是个人偏好,你经常会看到这个:

self = this

而不是

var self = this;

没什么大不了的,但这只是我认为可能值得一提的惯例。

答案 1 :(得分:0)

对于第一点,无论如何它都会在RAM中,我不能说为什么不断引用它会改变任何东西。

至于第二点,最好将此引用的对象存储在诸如self或_this之类的变量中,因为在Javascript中调用函数时,函数的上下文可以通过调用操作并应用将执行的函数然后改变这意味着什么。

所以这个:

MyClass = function(){ 
    this.name = "Petter";
    this.age = 12;
    this.toString = function(){
        return "Name: "+this.name + " Age: " + this.age;  
    }
}
myObject = new MyClass();
myObject.call({name: 'bob', age: '15'});

myObject.call行实际上将在toString中更改对此的引用,因此它将返回“Name:Bob Age:15”而不是“Name:Peter Age:12”

答案 2 :(得分:0)

  1. 不,您可能会混淆这样一个事实,即如果您在实例化对象时没有使用the new keyword,则可以复制与每个对象实例关联的原型函数。

  2. 正如Adam的回答中提到的,你只是通过添加另一个变量来使用更多内存。按照惯例,当它们是私有实例变量时,您通常会看到variable names prefixed with an underscore