编辑:我最后从 Bergi 的回答中弄明白了。
谢谢伯吉。
pubPrivExample = (function () {
return {
init : function () {
var private;
this.setPrivate = function (p) {
private = p;
};
this.getPrivate = function () {
return private;
};
},
public : "This is public\n"
};
}());
var a;
a = Object.create(pubPrivExample);
a.init();
a.setPrivate("This is private");
document.write(a.getPrivate());
编辑:我的问题的答案似乎离题了。我真的对工厂不感兴趣,实际上宁愿不使用 if。我的问题是关于私有(private)国家。从 Bergi 的回答和评论中,我认为我可以找到一些东西。
待续...
编辑:Bergi 已经开始回答下面的问题,但遗漏了最重要的部分——私有(private)状态。
我有时间仔细考虑这个想法,但我仍然无法在没有某种工厂的情况下使用 Object.create() 实现私有(private)状态。但我想错了,Bergi 暗示了一个解决方案......请随意以 Bergi 的回答为起点。
原文:我试图避免在 javascript 中使用 new
,这让我走到了一个奇怪的地方。我想要私有(private)对象成员,但我不想放弃 Object.create()
。
这是代码。
var trackQueue = {};
trackQueue.factory = function () {
var that, queue;
that = this;
queue = [];
that.push = function (item) {
queue.push(item);
};
that.work = function () {
document.write(queue + "<br />");
};
return {
work : that.work,
push : that.push
};
};
var a = Object.create( trackQueue.factory() );
a.push("a");
a.push("b");
a.push("c");
var b = Object.create( trackQueue.factory() );
b.push("d");
b.push("e");
b.push("f");
a.work();
b.work();
还有一个 jsfiddle
http://jsfiddle.net/dsjbirch/Wj6cp/10/
init
是否是 factory
方法的更惯用/更合适的名称?
这是疯了吗?
请保持友善 - javascript 不是我的母语。
最佳答案
是的,原型(prototype)上的 init 方法可能是更合适的名称:
var proto = {
init: function(args) {
// setting up private-scoped vars,
var example = args;
// privileged methods
this.accessPrivate = function(){ return example; };
// and other stuff
this.public = 5;
},
prop: "defaultvalue",
...
}
var instance = Object.create(proto);
instance.init();
但是,绝对没有理由不使用带有 new 关键字的经典构造函数,它优雅地结合了 Object.create
和 init
调用。
请注意,您使用 Object.create
完全没有用。您的工厂模式(完全有效的应用)返回好的对象。无需为每个继承自它们的对象创建新对象。只是做:
var instance = trackQueue.factory();
如果您喜欢方法名称“create”的发音,您可以为您的工厂使用更惯用的名称:
trackQueueFactory.create = function(args) {...};
编辑:您将工厂模式与原型(prototype)继承相结合的想法并没有错。然而,所有构造对象继承自的原型(prototype)对象需要是静态的,而不是在每次调用时创建一个新对象。您的代码可能如下所示:
var factory = {
proto: {
...
},
create: function(args) {
var product = Object.create(this.proto);
// set up private vars scoped to the create function
// privileged methods
product.doSomethingSpecial = function(){ ... };
// and other stuff
}
};
var a = factory.create(...);
关于javascript - 如何使用 Object.create() 而不是 new 创建具有私有(private)成员的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11253717/