Javascript 如何在另一个对象方法中引用对象方法
我基本上不了解javascript的OOP。我的理解是,我可以这样上课Javascript 如何在另一个对象方法中引用对象方法,javascript,oop,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,它
var Car = function(){}
Car.prototype.GetBrand = function(){ return "Ford";}
Car.prototype.GetYear = function(){ return "1989";}
var ford = new Car();
ford.GetBrand();
ford.GetYear();
这很有效。。。
现在我想实现一个函数GetInfo,它应该打印出品牌和日期
如何在GetInfo()方法中引用GetBrand()和GetYear()方法
这不是正确的访问器。。。
我错过了什么
确定编辑:
这是一个简化的示例,我的realy方法调用位于函数中,这就是我们讨论另一个作用域的原因:
JsonLoader.prototype.GetJsonAndMerge = function(url,template,tagToAppend){
$.ajax({
url: url,
dataType: 'json',
success: function(data) {
this.ShowItems(data,template,tagToAppend);
}
});
}
我试图达到我的ShowItems方法。。。这也是函数中的一个例子,这可能就是为什么这个操作符不起作用的原因。。。很抱歉造成混淆=/您缺少一个意外的递归:
Car.prototype.GetInfo = function (){
return this.GetBrand()+ ' '+ this.GetYear(); // instead of GetInfo() !
}
然后你可以打电话
ford.GetInfo() // returns "Ford 1989"
编辑:此处使用
prototype
的原因是为了节省内存。调用newcar()
时,对象将被复制,而不是传统意义上的“构造”。在上调用new
var Car = function(){
this.GetBrand = function(){ return "Ford";}
this.GetYear = function(){ return "1989";}
}
也会将函数体复制到每个实例。这就是为什么将方法放入原型链中是有意义的。另外,只有将函数添加到原型链时,才能将其添加到现有实例中
还要注意的是,惯例是只给构造函数的首字母大写,所以Car
可以,但是GetInfo
应该是GetInfo
您缺少一个意外的递归:
Car.prototype.GetInfo = function (){
return this.GetBrand()+ ' '+ this.GetYear(); // instead of GetInfo() !
}
然后你可以打电话
ford.GetInfo() // returns "Ford 1989"
编辑:此处使用
prototype
的原因是为了节省内存。调用newcar()
时,对象将被复制,而不是传统意义上的“构造”。在上调用new
var Car = function(){
this.GetBrand = function(){ return "Ford";}
this.GetYear = function(){ return "1989";}
}
也会将函数体复制到每个实例。这就是为什么将方法放入原型链中是有意义的。另外,只有将函数添加到原型链时,才能将其添加到现有实例中
还要注意的是,惯例是只给构造函数的首字母大写,所以Car
可以,但是GetInfo
应该是GetInfo
您正在从其定义内部调用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()调用它。
您正在从其定义内部调用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()
递归调用GetInfo
就可以了
你可能是说:
return this.GetBrand()+ ' '+ this.GetYear();
// ^^^^
这很好。您正在递归调用
GetInfo
你可能是说:
return this.GetBrand()+ ' '+ this.GetYear();
// ^^^^
这很好。
此
对其所在函数的调用方式是上下文敏感的
当调用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);
}
});
}
此
对其所在函数的调用方式是上下文敏感的
当调用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);
}
});
}
那么,您的ShowItems方法实际上是什么的一部分?你为什么要用
这个?Wowzers来达到它。这是一个完全不同的问题。这是一个很好的教训,告诉我们为什么应该测试简化的测试用例,以确保它们仍然显示相同的问题(具有相同的错误消息)。@Thomas Shields:ShowItems也是(或应该是)JsonLoader的成员方法,。。。ShowItems(数据、模板、tagToAppend)那么您的ShowItems方法实际上是什么的一部分呢?你为什么要用这个?Wowzers来达到它。这是一个完全不同的问题。这是一个很好的教训,告诉我们为什么应该测试简化的测试用例,以确保它们仍然显示相同的问题(具有相同的错误消息)。@Thomas Shields:ShowItems也是(或应该是)JsonLoader的成员方法,。。。感谢您的回复。我可能还有另一个范围问题。。。我编辑了这个问题。我正在点击submit to early…@serverinfo:是的,请参阅我的第二次编辑。此
的含义因上下文而异。如果要在调用之间保留某种意义,必须将当前的this
存储在临时变量中。@serverinfo:没关系!:)说明:调用Ajax成功回调时,不需要任何上下文this
始终是调用函数的对象(这就是为什么function.call()
和function.apply()
首先可以工作的原因),并且回调函数不会在任何特定对象上调用。因此,this
是回调的全局(window
)对象,它不知道ShowItems()
。通过您在此处创建的闭包,self
(以及参数)的内容将被保留。感谢您的回复。我可能还有另一个范围问题。。。我编辑了这个问题。我正在点击submit to early…@serverinfo:是的,请参阅我的第二次编辑。此
的含义因上下文而异。如果要在调用之间保留某种意义,必须将当前的this
存储在临时变量中。@serverinfo:没关系!:)说明:当调用Ajax成功回调时,它是在没有任何错误的情况下完成的