Javascript 在工厂函数中包含的原型对象文本中使用闭包与此相反

Javascript 在工厂函数中包含的原型对象文本中使用闭包与此相反,javascript,v8,Javascript,V8,使用闭包而不是实例属性更可取吗?与将属性作为实例属性向下传递相比,保持父作用域活动的内存开销是多少 const FooFactory = ({ id }) => { const proto = { getIdFromClosure() { return id; }, getId() { return this.id; } }; return Object.create(proto, { id: { value: id }

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

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

可以使用闭包变量实现信息隐藏。属性就像其他语言中的公共成员变量一样,可以直接访问;e、 在您的示例中,您可以使用foo.id而不是foo.getId。闭包变量不能从类外部直接访问,因此它就像私有成员变量一样,必须调用函数才能访问它


如果您不想使值可见,或者如果您想保留更改其表示方式的功能,这将非常有用。

在工厂内创建原型对象没有任何意义。你应该使用其中一种

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


如果id与该对象关联,则可能存在重复,我不确定您为什么不希望它作为属性。有什么强迫你考虑关闭的吗?现在,您还为创建的每个对象创建了一个单独的原型对象。作为一个属性,您也可以共享一个原型,这实际上是原型继承的要点。虽然我个人更喜欢避免完全使用this关键字,但在这种情况下,确实没有其他理由使用闭包。关于单独的原型对象创建,您是对的。为了获得原型遗传的好处,它必须独立生活。完全忽略了这个事实。感谢您的帮助。虽然我了解闭包及其对私人成员的使用,但您让我想到,与其使用闭包来阻止写访问,通过object.create使用实例属性是更好的选择。在构造函数中使用object.create和分配给this.id之间没有区别。使用object.create的第二个参数时,可以将实例属性的writable设置为false,但这有点离题。
const proto = {
  getId() {
    return this.id;
  }
};
function FooFactory(id) {
  return Object.assign(Object.create(proto), {id});
}