Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript面向对象应用程序结构_Javascript_Oop_Javascript Objects_Module Pattern - Fatal编程技术网

Javascript面向对象应用程序结构

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

我试图以一种更面向对象的方式重写JS web应用程序

假设我有一个名为Application的主对象:

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 || {});