Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.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 - Fatal编程技术网

Javascript 如何调用所有者对象的函数

Javascript 如何调用所有者对象的函数,javascript,Javascript,我有几个业务对象(具有不同的类型),它们实现了一个公共对象的功能,该对象被分配给每个业务对象的属性。 是否可以从公共对象调用在业务对象上声明的函数 以下是一些类似的代码: var Percent=function(){ this.input=null; ... this.getValuesRange=函数(){ 返回值[最小值,最大值]; } ... } 变量速度=函数(){ this.input=null; ... this.getValuesRange=函数(){ 返回值[最小值,最大值];

我有几个业务对象(具有不同的类型),它们实现了一个公共对象的功能,该对象被分配给每个业务对象的属性。 是否可以从公共对象调用在业务对象上声明的函数

以下是一些类似的代码:

var Percent=function(){
this.input=null;
...
this.getValuesRange=函数(){
返回值[最小值,最大值];
}
...
}
变量速度=函数(){
this.input=null;
...
this.getValuesRange=函数(){
返回值[最小值,最大值];
}
...
}
var输入=函数(){
this.inputRange=函数(){
//这里我需要调用所有者的getValuesRange函数
}
}
变量输入=新输入();
var mySpeed=新速度();
var rocketSpeed=新速度();
...
mySpeed.input=输入;
火箭速度输入=输入;
...
facade.enter(mySpeed);
正面。进入(火箭速度);
...

对于
Input
上的
inputRange
要访问
getValuesRange
,它必须访问
速度的实例。您的代码必须提供该实例,JavaScript中没有内置的“什么对象通过属性引用这个对象”操作。(如果存在,则必须考虑到多个对象可以引用同一个对象,如您的示例中所示-两个
Speed
实例都引用相同的
Input
实例。)

这在一些解决方法中是可能的。这里有一个例子:

var c = 0;

var Speed= function(){
    var mc = c++;

    var _input = null;
    var _inputRange = null;

    this.getInput= function() {
        var self = this;

        _input.inputRange = function() {
            _inputRange.call(self);
        }

        return _input;
    }

    this.setInput= function(input) {
        _input = input;
        _inputRange = input.inputRange;
    }

    this.getValuesRange= function(){
        console.log("Speed", mc);
    }
}

var Input= function(){
    this.inputRange= function(){
        this.getValuesRange()
    }
}

var input= new Input();
var mySpeed= new Speed();
var rocketSpeed= new Speed();

mySpeed.setInput(input);
rocketSpeed.setInput(input);

mySpeed.getInput().inputRange(); // Speed 0
rocketSpeed.getInput().inputRange(); // Speed 1

此解决方案可能存在许多陷阱。这里只是想给出一个想法。

您可以将Speed实例传递给输入对象,然后使用它,这样我就明白您和太平洋公司所说的是,我应该将业务对象实例传递给输入对象。有些类似Input.currentOwner=mySeed;是吗?@TJCrowder我不能完全同意你的观点,因为从实例到构造函数.prototype的整个原型委托是建立在多个对象(实例)确实引用同一个对象(构造函数.prototype)的事实上的。在这种情况下,“什么对象通过属性引用这个对象”操作就是“this”关键字解析。因为constructor.prototype上的方法能够知道它们应该影响哪个实例,这要归功于“this”值。事实上,我的难看的解决方法基于相同的概念:每次调用“inputRange”方法都会正确设置其“this”。Gents,所有与输入相关的逻辑都在输入对象上,并且它的当前所有者实例上(关于业务对象)应该对该逻辑透明。这就是为什么mySpeed.getInput().inputRange()在这种情况下没有意义。从输入实例调用currentOwner.getValuesRange()时,我想知道这是否是最好的解决方案