如何在另一个对象方法中引用对象方法

时间:2011-05-28 13:41:42

标签: javascript oop

我基本缺乏理解javascript的OOP。我的理解是我可以制作这样的课程

var Car = function(){}

Car.prototype.GetBrand = function(){ return "Ford";}
Car.prototype.GetYear = function(){ return "1989";}

var ford = new Car();

ford.GetBrand();
ford.GetYear();

这个有用...... 现在我想实现一个GetInfo函数,这应该打印出Brand&日期

如何在GetInfo()方法中引用GetBrand()和GetYear()方法。

  This is not working:
Car.prototype.GetInfo = function(){ 
        return this.GetBrand()+ ' '+ this.GetYear();
    }

这不是正确的访问者...... 我在这里想念什么?

确定编辑: 这是一个简化的例子,我的realy方法调用是在另一个函数中,这就是我们讨论另一个范围的原因:

JsonLoader.prototype.GetJsonAndMerge = function(url,template,tagToAppend){
$.ajax({
    url: url,
    dataType: 'json',
    success: function(data) {
        this.ShowItems(data,template,tagToAppend); 
        }
    });
}

我尝试到达我的ShowItems方法......在这里,这又是一个函数,这可能是为什么这个运算符不起作用...抱歉混淆= /

4 个答案:

答案 0 :(得分:2)

您错过了非预期的递归:

Car.prototype.GetInfo = function (){  
  return this.GetBrand()+ ' '+ this.GetYear(); // instead of GetInfo() !
}

然后你可以打电话

ford.GetInfo() // returns "Ford 1989"

编辑:这里使用prototype的原因是为了节省内存。当你调用new Car()时,对象会被复制,而不是传统意义上的“构造”。在

上拨打new
var Car = function(){
  this.GetBrand = function(){ return "Ford";}
  this.GetYear = function(){ return "1989";}
}

还会将函数体复制到每个实例。这就是为什么将方法放入原型链中是有道理的。此外,只有在已经存在的实例中添加函数才能将其添加到原型链中。

另请注意,约定是仅为构造函数提供大写首字母,因此Car可以,但GetInfo 应为getInfo。< / p>


JsonLoader.prototype.GetJsonAndMerge = function(url,template,tagToAppend){
  var self = this;
  $.ajax({
    url: url,
    dataType: 'json',
    success: function(data) {
      self.ShowItems(data,template,tagToAppend); 
      }
    });
  }
}

答案 1 :(得分:1)

你从其定义中调用GetInfo;自然这不起作用:

Car.prototype.GetInfo = function(){ 
        return this.GetBrand()+ ' '+ this.GetInfo(); //note GetInfo here
    }

我相信你想要:

Car.prototype.GetInfo = function(){ 
            return this.GetBrand()+ ' '+ this.GetYear(); //note GetYear here
        }

...然后只需使用ford.GetInfo()

调用它

答案 2 :(得分:0)

您正在递归地呼叫GetInfo

你可能意味着:

return this.GetBrand()+ ' '+ this.GetYear();
//                                   ^^^^

哪种方法正常。

答案 3 :(得分:0)

this对其所处的函数的调用具有上下文敏感性。

您尝试在调用this时使用foo.GetJsonAndMerge,但未在GetJsonAndMerge中使用$.ajax。您在this调用的匿名函数中使用它。

您需要在变量中复制JsonLoader.prototype.GetJsonAndMerge = function(url,template,tagToAppend){ var that = this; // COPY THIS $.ajax({ url: url, dataType: 'json', success: function(data) { // USE THE COPY YOU PLACED IN THAT INSTEAD OF THIS that.ShowItems(data,template,tagToAppend); } }); } 的当前值,该变量在被调用时仍可供匿名函数使用。

{{1}}