如何在Javascript中使用对此的新引用调用父定义块
如果我在JS中有一个父对象,它将一个块保存到一个键中,我如何在一个嵌套对象中调用它,并正确引用“this”如何在Javascript中使用对此的新引用调用父定义块,javascript,object,inheritance,hash,Javascript,Object,Inheritance,Hash,如果我在JS中有一个父对象,它将一个块保存到一个键中,我如何在一个嵌套对象中调用它,并正确引用“this” var colors = { foo: function () { return this.color; }, red: { color: 'red', myColor: function () { return foo(); } }, blue: {
var colors = {
foo: function () {
return this.color;
},
red: {
color: 'red',
myColor: function () {
return foo();
}
},
blue: {
color: 'blue',
myColor: function () {
return foo();
}
}
};
这就是我所说的
colors.blue.myColor();
输出将是
"blue"
我使用这个想法的确切背景是
var accounts = {
checking: {
balance: 0,
deposit: function (amount) {
if (amount > 0) {
this.balance += amount;
}
},
withdraw: function (amount) {
var tA = accounts.totalAmount();
if (amount > 0 && amount <= this.balance) {
this.balance -= amount;
} else if (tA >= amount) {
accounts.savings.withdraw(amount - this.balance);
this.balance = 0;
}
}
},
savings: {
balance: 0,
deposit: function (amount) {
if (amount > 0) {
this.balance += amount;
}
},
withdraw: function (amount) {
var tA = accounts.totalAmount();
if (amount > 0 && amount <= this.balance) {
this.balance -= amount;
} else if (tA > amount) {
accounts.checking.withdraw(amount - this.balance);
this.balance = 0;
}
}
},
totalAmount: function() {
return accounts.savings.balance + accounts.checking.balance
}
};
在这里,我想把存款功能从储蓄和支票中拉出来,取而代之的是调用block 您是否尝试将值传递给foo
var colors = {
foo: function (t) {
return t.color;
},
red: {
color: 'red',
myColor: function () {
return colors.foo(this);
}
},
blue: {
color: 'blue',
myColor: function () {
return colors.foo(this);
}
}
};
colors.blue.myColor();
您是否尝试过将值传递给foo
var colors = {
foo: function (t) {
return t.color;
},
red: {
color: 'red',
myColor: function () {
return colors.foo(this);
}
},
blue: {
color: 'blue',
myColor: function () {
return colors.foo(this);
}
}
};
colors.blue.myColor();
当您调用myColor时,它将查找名为foo的函数对象,但在其作用域中找不到。因此,它将失败
实际上,您可以在iLife的帮助下定义一个私有的foo函数,并将myColor作为foo的引用,如下所示
var colors = (function() {
function foo() {
return this.color;
}
return {
red: {
color: 'red',
myColor: foo
},
blue: {
color: 'blue',
myColor: foo
}
}
})();
console.log(colors.blue.myColor());
# blue
console.log(colors.red.myColor());
# red
当您调用myColor时,它将查找名为foo的函数对象,但在其作用域中找不到。因此,它将失败
实际上,您可以在iLife的帮助下定义一个私有的foo函数,并将myColor作为foo的引用,如下所示
var colors = (function() {
function foo() {
return this.color;
}
return {
red: {
color: 'red',
myColor: foo
},
blue: {
color: 'blue',
myColor: foo
}
}
})();
console.log(colors.blue.myColor());
# blue
console.log(colors.red.myColor());
# red
除非您自己存储一个不能在静态声明中完成的父对象引用,否则无法在javascript中获取父对象引用—它必须通过代码完成。如果没有其他人给您一个父引用,您也无法访问父属性。似乎您最好定义一个类颜色,它有一个字段颜色和函数myColor。@jfriend00如果我想在对象外部调用该函数,比如在单击事件中调用,如何避免重复该函数?我会将其解析为foo函数,然后使用它吗?对不起,我对应该阅读的内容有点迷茫。@NickTho-我们必须看看你的代码到底想实现什么,但我的猜测是,您需要一个更易于使用的不同数据结构。@music_coder我在一个稍微不同的上下文中使用这个想法,其中每个子对象将具有不同的功能,而不仅仅是myColor,但是这些函数中的每一个都必须在某个时候调用foo。除非您自己存储一个不能在静态声明中完成的父对象引用,否则无法在javascript中获取父对象引用—必须使用代码来完成。如果没有其他人给您一个父引用,您也无法访问父属性。似乎您最好定义一个类颜色,它有一个字段颜色和函数myColor。@jfriend00如果我想在对象外部调用该函数,比如在单击事件中调用,如何避免重复该函数?我会将其解析为foo函数,然后使用它吗?对不起,我对应该阅读的内容有点迷茫。@NickTho-我们必须看看你的代码到底想实现什么,但我的猜测是,您需要一个更易于使用的不同数据结构。@music\u coder我在一个稍微不同的上下文中使用这个想法,其中每个子对象将有一个不同的函数,不仅是myColor,而且这些函数中的每一个都必须在某个时候调用foo。是的!谢谢你。我现在觉得我错过了这个太傻了。是的!谢谢你。我现在错过了这个,真是太傻了。谢谢!从现在开始,我将这样构造这些对象,以便正确定义其范围。谢谢!从现在起,我将像这样构造这些对象,以便正确定义其范围。