2011-05-28 76 views
0

我在理解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,这应该打印出品牌&日期

我怎么可以参考GetBrand ()和GetYear()方法在我的GetInfo()方法中。

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

这是不正确的访问... 我怎么会错过吗?

OK编辑: 这是一个简单的例子还有我真的方法调用是anothe功能,这就是为什么我们在谈论另一个范围:

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

我试图达到我ShowItems方法...这里而这又是一个函数这也许为什么这个操作符不工作...的混乱对不起=/

+0

那么你的ShowItems方法实际上是什么?你为什么试图用'this'来达到它? – 2011-05-28 13:58:49

+0

Wowzers。这是一个完全不同的问题。为什么您应该测试缩减的测试用例以确保它们仍然显示相同的问题(具有相同的错误消息),这是一个很好的教训。 – Quentin 2011-05-28 14:01:32

+0

@Thomas Shields:ShowItems也是(或者应该是)JsonLoader的成员方法,... JsonLoader.prototype.ShowItems(data,template,tagToAppend) – 2011-05-28 14:05:28

回答

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


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

感谢您的回复。我可能会遇到另一个范围问题......我编辑了这个问题。我正在提交早... – 2011-05-28 13:59:54

+0

@ serverinfo:是的,看到我的第二次编辑。 “this”的含义从上下文变为上下文。如果你想在呼叫中保留一定的含义,你必须将当前的'this'存储在一个临时变量中。 – Tomalak 2011-05-28 14:03:53

+0

谢谢你的工作......对不起所有的困惑...... =) – 2011-05-28 14:11:40

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()

+0

是的,我错了,编辑它。 – 2011-05-28 13:58:51

0

您递归调用GetInfo调用它。

你大概的意思是:

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

工作正常。

+0

是的,谢谢编辑我的问题 – 2011-05-28 13:58:28

0

this对其调用函数的上下文敏感。

您正在调用foo.GetJsonAndMerge时尝试使用this,但您没有在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); 
     } 
    }); 
} 
相关问题