在工厂函数中包含的原型对象文字中使用闭包与 this
Using closures vs this in prototype object literals contained in factory functions
使用闭包而不是实例属性更可取吗?与将属性作为实例属性向下传递相比,保持父作用域活动的内存开销是多少?
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
您可以使用闭包变量来实现信息隐藏。属性就像其他语言中的"public"成员变量一样,可以直接访问;例如在您的示例中,您可以使用 foo.id
而不是 foo.getId()
。闭包变量不能直接从 class 外部访问,所以它就像 "private" 成员变量,你必须调用一个函数才能访问它。
如果您不想让该值可见,或者如果您想要保留更改其表示方式的能力,这将很有用。
在工厂内部创建原型对象毫无意义。您应该使用
function FooFactory(id) {
return {
getIdFromClosure() {
return id;
}
};
}
或
const proto = {
getId() {
return this.id;
}
};
function FooFactory(id) {
return Object.assign(Object.create(proto), {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
您可以使用闭包变量来实现信息隐藏。属性就像其他语言中的"public"成员变量一样,可以直接访问;例如在您的示例中,您可以使用 foo.id
而不是 foo.getId()
。闭包变量不能直接从 class 外部访问,所以它就像 "private" 成员变量,你必须调用一个函数才能访问它。
如果您不想让该值可见,或者如果您想要保留更改其表示方式的能力,这将很有用。
在工厂内部创建原型对象毫无意义。您应该使用
function FooFactory(id) {
return {
getIdFromClosure() {
return id;
}
};
}
或
const proto = {
getId() {
return this.id;
}
};
function FooFactory(id) {
return Object.assign(Object.create(proto), {id});
}