我已经定义了方法" 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。我做错了什么?
答案 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]]
,但是,非常高,高度不推荐,这就是为什么:
如果变量不再在全局范围内,则会成为问题。例如,如果将代码放在函数内部(包括IIFE或document 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();