在工厂函数中包含的原型对象文字中使用闭包与此对比

时间:2018-01-16 21:46:12

标签: javascript v8

最好使用闭包而不是实例属性吗?与将属性作为实例属性向下传递相比,保持父作用域活动的内存开销是多少?

const FooFactory = ({ id }) => {
  const proto = {
    getIdFromClosure() {
      return id;
    },
    getId() {
      return this.id;
    }
  };

  return Object.create(proto, { id: { value: id } });
};

const foo = FooFactory({ id: 123 });  
foo.getIdFromClosure(); // 123
foo.getId(); // 123

2 个答案:

答案 0 :(得分:1)

您可以使用闭包变量来实现信息隐藏。属性就像" public"其他语言的成员变量,可以直接访问;例如在您的示例中,您可以使用foo.id代替foo.getId()。闭包变量不能直接从课外访问,因此它类似于" private"成员变量,你必须调用一个函数来访问它。

如果您不想显示值,或者您希望保留更改其代表方式的功能,则此功能非常有用。

答案 1 :(得分:0)

在工厂内创建原型对象是没有意义的。你应该使用

function FooFactory(id) {
  return {
    getIdFromClosure() {
      return id;
    }
  };
}

const proto = {
  getId() {
    return this.id;
  }
};
function FooFactory(id) {
  return Object.assign(Object.create(proto), {id});
}