我基本缺乏理解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方法......在这里,这又是一个函数,这可能是为什么这个运算符不起作用...抱歉混淆= /
答案 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}}