请查看功能Y"重用"功能X的itemCount getter。我认为我应该能够将其定义为 itemCount:x.ItemCount ,但这并不起作用。
问题:有人可以解释为什么我必须执行以下操作才能从Y返回X的itemCount吗?必须有一些能使正常功能变得特别的东西。
// Returns simple object literal with 2 properties.
function X () {
return {
items: {
1: {},
2: {}
},
get itemCount () {
return Object.keys(this.items).length;
}
}
}
// Returns a simple object literal with the same 2 properties as its "x" arg.
function Y (x) {
return {
items: x.items,
get itemCount () {
return x.itemCount;
}
};
}
var x = new X();
var y = new Y(x);
y.itemCount; // returns 2
答案 0 :(得分:1)
如果使用函数而不是getter,则必须绑定this
的值。
例如:
function X () {
return {
items: {
1: {},
2: {}
},
itemCount: function() {
return Object.keys(this.items).length;
}
}
}
function Y (x) {
return {
items: x.items,
itemCount: x.itemCount.bind(x)
};
}
当您致电x.itemCount()
时,this
的值位于x
的上下文中,但是如果您致电y.itemCount()
(y
是从Y(x)
创建的对象{1}})this
将位于y
。
要解决此问题,您需要使用this
绑定bind()
变量。
答案 1 :(得分:0)
您正在运行代码return x.itemCount
。因此,预期return
语句返回的值是itemCount
上x
属性的计算值 - x.itemCount
可能还有什么?
如果你想在另一个对象上运行itemCount
getter的代码,最好的方法是将项目计数代码提取到一个由getter使用的单独函数中:
function itemCounter(obj) {
return Object.keys(obj.items).length
}
然后每个itemCount
吸气者都可以return itemCounter(this)
。
如果您无法修改x
,则可以使用call
的{{1}}来优雅地提取getter和this
:
y