我是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/
答案 0 :(得分:4)
据我所知,将实例的变量名称作为字符串是不可能的。我也真的不明白为什么你会这样做,因为它很不切实际。我只是将你想插入的元素作为字符串传递:
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;
现在只需将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();