谢谢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。我的问题是关于私人国家。根据Bergi的回答和评论,我想我可以把一些东西拉到一起。
继续......
编辑:Bergi已经开始回答下面的问题,但遗漏了最重要的部分 - 私人国家。我有时间更多地考虑这个想法,但是如果没有某种工厂,我仍然无法使用Object.create()来实现私有状态。但我想说错了,Bergi提到了一个解决方案......随意把Bergi的答案作为一个起点。
ORIGINAL:我在javascript中避免使用new
的过程让我陷入了一个奇特的地方。我想要私人对象成员,但我不想放弃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不是我的第一语言。
答案 0 :(得分:2)
是的,原型上的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();
但是,绝对没有理由不将经典构造函数与新关键字一起使用,该关键字优雅地结合了Object.create
和init
调用。
请注意,您使用的Object.create
完全没用。您的工厂模式(完全有效应用)返回好的对象。无需为从它们继承的每个创建新对象。只是做:
var instance = trackQueue.factory();
如果你喜欢方法名称“create”的声音,你可以为你的工厂使用一个更惯用的名称:
trackQueueFactory.create = function(args) {...};
编辑:您将工厂模式与原型继承相结合的想法并没有错。然而,所有制造对象继承的proto对象需要是静态的,而不是在每次调用时创建一个新对象。您的代码可能如下所示:
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(...);
答案 1 :(得分:2)
我认为这是达到您要求的明确方法:
var personFactory = function(id, name, age){
var _id = id;
var _name = name;
var _age = age;
var personPrototype = {
getId: function(){
return _id;
},
setId: function(id){
_id = id;
},
getName: function(){
return _name;
},
setName: function(name){
_name = name;
},
getAge: function(){
return _age;
},
setAge: function(age){
_age = age;
},
work: function(){
document.write(this.toString());
},
toString: function(){
return "Id: " + _id + " - Name: " + _name + " - Age: " + _age;
}
};
return Object.create(personPrototype);
};
用法:
var renato = personFactory(1, "Renato Gama", 25);
console.log(renato.getName()); //logs "Renato Gama"
renato.setName("Renato Mendonça da Gama");
console.log(renato.getName()); //logs "Renato Mendonça da Gama"
如果我没有错,这就是MODULE PATTERN的用法。有关更好的解释,请参阅this post。 This也是关于这个主题的好帖子。