JavaScript/loopback:添加属性,其值是函数的结果

javascript/loopback: add property which value is the result of a function

本文关键字:函数 结果 loopback 添加 属性 JavaScript      更新时间:2023-09-26

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

我想你是说你想要一个属性上的"getter"行为。基本上你想调用一个没有参数的函数。如果是这样,您可以使用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 的一部分,作为外部库,还是作为你自己的更简单的实现。