gpt4 book ai didi

javascript - 如何设计一个具有私有(private)状态并且可以被实例化多次的JS对象?

转载 作者:行者123 更新时间:2023-12-03 02:28:25 25 4
gpt4 key购买 nike

只是想了解基于原型(prototype)的设计

问题:使用已知的 API 实现一个数据结构(例如优先级队列)。实例化 PQ 的多个实例。

所以我使用了如下的揭示模块模式

module.exports = (function () {
// ... assume the following methods are revealed. Other private methods/fields are hidden
let priorityQueue = {
insert,
removeMax,
isEmpty,
toString
};

return {
priorityQueue,
newObj: (comparer, swapper) => {
let instance = Object.create(priorityQueue);
instance.array = [];
instance.size = 0;
instance.less = comparer;
instance.swap = swapper;
return instance;
}
}
})();

创建了一个 newObj 工厂方法来创建有效的实例。 priorityQueue 是 API/原型(prototype)。

  • 因此方法属于原型(prototype)。
  • 实例字段不能驻留在此处;它们将在实例之间共享。

但是在这种情况下,PQ的内部字段没有被封装。

const pQ = require('./priorityQueue').newObj(less, swap);
pQ.array = undefined; // NOOOOOOO!!!!

更新:为了澄清我的问题,原型(prototype)对象中的方法需要对实例字段数组和大小进行操作。但是这些字段不能跨实例共享。原型(prototype)中的方法如何关闭对象中的实例字段?

最佳答案

不要将数组或任何您想要封装的内容分配给新对象。

module.exports = (function () {
// ... assume the following methods are revealed. Other private methods/fields are hidden
let priorityQueue = {
insert,
removeMax,
isEmpty,
toString
};

return {
priorityQueue,
newObj: function(comparer, swapper){
let array = [];

let instance = Object.create(priorityQueue);
instance.size = 0;
instance.less = comparer;
instance.swap = swapper;
return instance;

}
}
})();

关于javascript - 如何设计一个具有私有(private)状态并且可以被实例化多次的JS对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48845159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com