功能改变"这"变量

时间:2016-09-07 03:02:24

标签: javascript this

我是JavaScript的新手,并试图了解一些OOP的基础知识和模拟"类"。

在执行此脚本的最后一行时,我希望第4行上调用的this对象指针引用farm对象(就像它在第2行和第3行中正确执行的那样)。

不幸的是它没有,我猜想this对象指针指向document

var Building = function(cost){
    this.cost = cost;
    this.printCost = function(){
        document.getElementById(this).innerHTML = this.cost;
    }
}

var farm = new Building (50);

farm.printCost();

-

<html>
<body>
<p id="farm">
</p>
</body>
</html>

有没有办法让这个功能使用正确的对象?如果我的理解有任何错误,请告诉我。

我还不熟悉jQuery,所以如果你坚持使用核心JavaScript语法,我会很感激!

JSFiddle:https://jsfiddle.net/7n2of9k7/

3 个答案:

答案 0 :(得分:4)

据我所知,将实例的变量名称作为字符串是不可能的。我也真的不明白为什么你会这样做,因为它很不切实际。我只是将你想插入的元素作为字符串传递:

&#13;
&#13;
var Building = function(cost, element){
    this.cost = cost;
    this.printCost = function(){
        document.getElementById(element).innerHTML = this.cost;
    }
}

var farm = new Building(50, 'farm');

farm.printCost();
&#13;
<p id="farm">
</p>
&#13;
&#13;
&#13;

现在只需将ID传递给函数,即可正确插入。您也可以将其传递给printCost

答案 1 :(得分:2)

&#34;构造函数方法中的THIS&#34; 始终指示该构造函数的实例,在您的情况下 this == farm 。您是在getElementById()方法中传递整个对象实例。更改printCost方法以获取与 this 匹配的对象实例的名称。您需要遍历将具有所有变量的窗口对象在其范围内定义。因此,您的对象将是从窗口对象获取变量名称,该变量名称与变量&#34; farm&#34; 的名称相匹配。然后在getElementById()check this answer for more detail

中使用它
this.printCost = function(){
    for(var prop in window){
       if(window[prop]==this){
           document.getElementById(prop).innerHTML = this.cost;
       }
    }

}

答案 2 :(得分:-4)

您必须将此分配给变量,并在匿名

上使用它
function
    var Building = function(cost){
    this.cost = cost;
    var currentObj = this;
    this.printCost = function(){
        document.getElementById(this).innerHTML = currentObj.cost;
    }
}

var farm = new Building (50);

farm.printCost();