Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在另一个对象方法中引用对象方法_Javascript_Oop - Fatal编程技术网

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

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,它

我基本上不了解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,它应该打印出品牌和日期

如何在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成功回调时,它是在没有任何错误的情况下完成的