javascript / loopback:添加属性,哪个值是函数

时间:2015-12-15 02:32:48

标签: javascript function properties prototype

编辑:这不是重复。 答案很好,但问题适用于 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中吗?

1 个答案:

答案 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的一部分返回,作为外部库,或者作为您自己更简单的实现。