通过JavaScript中的变量引用对象

时间:2016-09-28 21:27:50

标签: javascript

我已经定义了方法" checkThreshold"和" checkOtherObject"在我的原型中。 checkOtherObject遍历属性" nextDev"中列出的对象。并且应该为每个对象调用checkThreshold,因此:

// Protoype
function foo(otherObject) {
    // attributes       
    this.nextDev=otherObject; // comma-delimited list of objects

    // Method that references another method
    this.checkOtherObject= function() {
    successorList=this.nextDev.split(",");
        for (var i=0; i<successorList.length;i++) {
            successorList[i]['checkThreshold']();
        }
    }  
    // Method referenced by checkOtherObject
    this.checkThreshold = function () {
        <Do Stuff>     
    }
//Instantiations
var A = new foo ("B");
var B = new foo ("");

因此,预期的行为是A.checkOtherObject会调用B.checkThreshold,但是当我到达那一行时,不会调用B.checkThreshold。我做错了什么?

2 个答案:

答案 0 :(得分:0)

根本问题:你正在尝试为自己分配实例的值。注意:你正在做的事情仍然是错误的,otherObject是一个对象,但它是一个String对象,它不是指当前的 foo 的实例({{ 1}})。

this

其他问题是您正在调用 this.nextDev = otherObject ,而不是 String().checkThreshold 。您可以在声明中查看:

foo().checkThreshold

正如您所看到的,您正在迭代字符串文字。 successorList = this.nextDev.split(","); for (var i = 0; i < successorList.length; i++) { successorList[i]['checkThreshold'](); } 返回带有字符串文字的对象,而不是带有 String().split的列表。

foo()

我基本上不确定你的目标是什么。看起来你在String对象和对象之间存在一种非常普通的混淆。您可能希望将 /* confirm that the successorList is a array object */ successorList instanceof Array; // true /* confirm that the first successorList's item is a string object */ typeof successorList[0] === "string"; // true 存储在 nextDev 之外,而 foo() 则要存储 nextDev 包含 foo 实例的Array对象?然后尝试:

var devs = [];

function foo(string) {
    devs.push(this);
}

foo.prototype = {
    checkOtherObjects: function() {
        var me = this;
        var myIndex;
        var i = 0, len = devs.length;
        for (; i < len; ++i) {
            if (devs[i] === me) {
                myIndex = i;
                break;
            }
        }
        for (i = myIndex + 1; i < len; ++i)
            devs[i].checkThresold()
    }
};

答案 1 :(得分:0)

提供一些更好的解释 - 是的,你 CAN 使用window[successorList[i]],但是,非常高,高度不推荐,这就是为什么:

如果变量不再在全局范围内,则会成为问题。例如,如果将代码放在函数内部(包括IIFEdocument ready函数),则不能再从窗口对象引用变量,除非您使用窗口声明它们。 A,window.B,但声明这样的全局变量会变得如此混乱,尤其是在使用其他库/插件时。

那么......你怎么能解决这些问题呢?简单 - 将对象本身传递为@Bergi,而不是传递包含变量名称的字符串。

这是代码的样子:

// Protoype
function foo(otherObject) {
    this.nextDev = otherObject || [];
    // Method that references another method
    this.checkOtherObject = function() {
      this.nextDev.forEach(function(obj, index) {
        obj.checkThreshold();
      });
    };
    // Method referenced by checkOtherObject
    this.checkThreshold = function() {
      // Do Stuff
      console.log("Checking Threshold for: ", this);
    };
  }
  //Instantiations
var B = new foo(null);
var A = new foo([B]); //or [B, C, D, E, ...]
A.checkOtherObject();