javascript - 使用 getter 和 setter 进行函数链接的方法

标签 javascript ecmascript-6

如果我想使用流畅的函数链接来支持对象属性的分配。例如,像这样的东西:

foo.width(500).height(250).margin({left:5,right:10});

我显然可以创建一个函数定义:

margin(value) {
    this.config.margin = value;
    return this;
}

但是,如果我希望能够支持上述函数链接,但直接赋值,如:

foo.margin = {left:5,right:10};

我可以通过添加一个 setter 来添加这种支持:

set margin(value) {
    this.config.margin = value;
}

但是您不能拥有同名的 setter 和函数,显然 setter 仅适用于文字赋值操作,而函数定义仅适用于流畅的 API 方法。

有没有办法在 JS ES6 中以语法优雅的方式兼顾两者?


我已经包含了一个 fiddle ,它演示了流畅和文字赋值运算符的工作示例。唯一的问题?我不得不求助于使用不同的命名签名,这增加了 API 表面……如果可能的话,我想避免这种情况。

http://www.es6fiddle.com/i6o0jscx/

最佳答案

如果您愿意使用额外的两个字符来检索属性值,那么您可以这样做:

export class Foo {
  constructor() {
    this.config = {
      width:500,
      height: 400
    };
  }

  get width() {
    return function(value) {
      if (arguments.length) {
        this.config.width = value;
        return this;
      }
      return this.config.width;
    };
  }
  set width(value) {
    this.config.width = value;
  }
}

let foo = new Foo();
console.log(foo.width());
foo.width = 600;
console.log(foo.width());
console.log(foo.width(250).width());

基本上,getter 返回一个函数,如果调用时带参数,则返回值,如果调用时不带参数,则返回值。这类似于 jQuery 为 .text().html() 以及许多其他内容提供的 API,但它为您提供了直接分配给的附加选项该属性(property)。我不会真的推荐这个,因为能够做到 foo.width = 5; 而不是 var w = foo.width; 会让人感到困惑,但我不能找到完全实现您想要做的事情的好方法。

http://www.es6fiddle.com/i6o14n4b/

关于javascript - 使用 getter 和 setter 进行函数链接的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28773275/

相关文章:

javascript - 表单提交后停留在同一页面

javascript - 我如何淡化背景图像

javascript - 如何导出模块

angular - 为什么我的属性没有在 "Scope"内更新?

javascript - 如何在 javascript es6 类构造函数中声明对象

javascript - 将 cliendid 从控件作为参数从 ASP 传递到 javascript 函数

javascript - JS - 单击时重置计时器

javascript - 为什么 Airbnb 风格指南说不鼓励依赖函数名称推断?

Javascript es6 - 如何删除对象数组中的重复项,最后一个重复项除外?

javascript - jQuery 轮播重复