Javascript面向对象应用程序结构
我试图以一种更面向对象的方式重写JS web应用程序 假设我有一个名为Application的主对象:Javascript面向对象应用程序结构,javascript,oop,javascript-objects,module-pattern,Javascript,Oop,Javascript Objects,Module Pattern,我试图以一种更面向对象的方式重写JS web应用程序 假设我有一个名为Application的主对象: var Application = (function(obj) { obj.init = function() { console.log("Application init"); }; obj.move = function() { return { left: function() { console.lo
var Application = (function(obj) {
obj.init = function() {
console.log("Application init");
};
obj.move = function() {
return {
left: function() { console.log("Move left"); },
right: function() { console.log("Move right"); }
}
}
return obj;
})(Application || {});
我想添加另一个可能有多个实例的方法,因此我需要添加一个原型:(这发生在另一个文件中)
问题是我无法访问typeA()
的原型函数getID
。
这可能是因为我构建应用程序的方式。
我希望能够像这样调用prototype方法:
var a = Application.child.typeA();
a.getID();
如何以适当的方式为这样的对象添加原型?
我不熟悉面向对象的Javascript,因为JS中有很多方法可以构造面向对象的应用程序,我很确定我把它们搞砸了
我做错了什么
child
是一个返回对象的函数,您似乎希望将其作为对象本身。而且,在原型任务完成之前,它确实返回了。原型“object”本身是一个对象文本和函数之间的语法混合体
相反,使用
var Application = (function(obj) {
obj.child = {
typeA: function() {
console.log("New child object of type A");
this.childID = Math.floor((Math.random() * 10) + 1); // Just a random number
},
typeB: function() {
console.log("New child object of type B");
this.childID = Math.floor((Math.random() * 10) + 1); // Just a random number
}
};
obj.child.typeA.prototype.getID = function() {
console.log(this.childID)
};
return obj;
})(Application || {});
您也可以直接将对象文字指定给.prototype
,但过度修改现有对象
我构建应用程序的方式是一种良好的做法吗
是的,这是一种常见的模式。这个问题似乎离题了,因为它是关于正在工作的代码;也许codereview.stackexchange.com是解决此问题的更好位置。问题中的代码不起作用。我要问两个问题:如何使代码工作,如果代码工作,这是否是一个好的实践。通过添加一个对未来访问者有用的问题陈述来帮助我们。“此代码不起作用”不会帮助有你问题的人。每个在这里提问的人都这样做,因为他们的代码不起作用。有什么不起作用?它有什么不应该做的呢?你看到了什么行为?你希望看到什么样的行为?将此编辑到您的问题中;并改进标题,使其反映代码的实际问题。至于问“两个问题”,这让这有点像布拉德的问题——把它缩小到一个问题。我对这个问题进行了编辑,以便它陈述一个更清晰的问题。关于构造函数和原型的更多信息可以在这里找到:
var Application = (function(obj) {
obj.child = {
typeA: function() {
console.log("New child object of type A");
this.childID = Math.floor((Math.random() * 10) + 1); // Just a random number
},
typeB: function() {
console.log("New child object of type B");
this.childID = Math.floor((Math.random() * 10) + 1); // Just a random number
}
};
obj.child.typeA.prototype.getID = function() {
console.log(this.childID)
};
return obj;
})(Application || {});