编辑:这不是重复。
答案很好,但问题适用于 loopbackjs 的上下文。在那里,大多数属性都是异步。我尝试了所提出的解决方案并且它不起作用,因为异步访问属性count
:
node.__count__children(function(err, count) {
if (err) {
console.log(err);
return;
}
return count;
});
这意味着我不能直接依赖语言功能,但必须考虑到异步性。编辑结束
在django / python中,我可以像这样定义一个属性:
@property
def count_children(self):
return len(self.children)
这也适用于javascript吗?实际上我在环回的上下文中需要它,但也许这是该语言的一个特性?
我试过操纵原型:
Node.prototype.count_children = function() {
return this.children.length;
}
但是这只是向对象添加了一个函数count_children(),它没有将函数的值作为属性。这可能在javascript中吗?
答案 0 :(得分:2)
我认为你说你想要一个属性的“getter”行为。基本上你想要在没有parens的情况下调用函数。如果是,您可以使用Object.defineProperty()
来定义它:
Object.defineProperty(Node.prototype, "count_children", {
get: function() {
return this.children.length;
}
});
document.body.appendChild(document.createElement("pre")).textContent = "Total <li> count: " +
document.querySelector("ul").count_children;
<ul>
<li>foo
<li>bar
<li>baz
</ul>
如果你需要包装的行为是异步的,它似乎需要一个回调,因此getter属性不会提供分配一个的机会。
如果你要包装的API返回类似“Promise”对象的东西,你仍然可以返回它。您也可以将自己的Promise作为新ECMAScript 6的一部分返回,作为外部库,或者作为您自己更简单的实现。