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_Object_Methods - Fatal编程技术网

JavaScript方法和结构之间的差异

JavaScript方法和结构之间的差异,javascript,oop,object,methods,Javascript,Oop,Object,Methods,此方法的结构/调用之间有什么区别? 我经常看到不同的方法结构,我不明白每种方法的好处是什么 var obj = { some_method: function(){ return 'This works'; } } var Obj2 = function(){ return { some_method: function(){ return 'This works too'; } } }

此方法的结构/调用之间有什么区别?
我经常看到不同的方法结构,我不明白每种方法的好处是什么

var obj = {
    some_method: function(){
        return 'This works';
    }
}

var Obj2 = function(){
    return {
        some_method: function(){
            return 'This works too';
        }
    }
}

console.log(obj.some_method());

var obj3 = new Obj2();
console.log(obj3.some_method());
它们都返回它们应该返回的内容,但在什么情况下我应该使用它们中的每一个?

第一个类似于a,即不能有多个类型相同但状态不同的对象。就像在整个应用程序中只可能有一个实际的动物,而不是很多

一个更实际的例子,考虑这个页面。有多个

Post
s,每个都有自己的状态(他们有什么
Comment
s,他们有什么文本,他们当前正在编辑等等)。如果您刚刚做了
var post=
,那么这意味着只能有一个post。我怀疑您可能会有一些特别的jQuery来处理该单例中的多个帖子,但无论如何,您都没有对问题进行面向对象的建模


第二个错误是使用构造函数,创建的对象将不是
Obj2
的实例,而是
Object
。您可以使用如下构造函数:

function Obj2() {
   //initialize fields here
}

Obj2.prototype.someMethod = function(arg) {
     return this.state + arg;
};
返回对象文字在构造函数中起作用的原因是 允许返回任何类型的对象。但是构造构造函数是没有意义的 仅返回
对象
s

您通常只需要
对象
s将相关的静态功能分组在一起(行为,但不需要延长数据)
或者作为字典/映射/关联数组(数据但无行为)。

在第一个代码中,您调用的是
obj.some_method()
some_method
是一个函数,嵌套为
obj
的属性。此模式是名称空间的一种方式


在第二种情况下,您将使用
Obj2
作为构造函数创建一个对象。但是,您没有返回
Obj2
的实例,而是返回了一个与前面示例的
obj
具有相同结构的对象。这将使您从
instanceof
测试中得到错误的结果,因为
new Obj2
应该返回一个自身的实例,而您的代码没有这样做。

第二个可能是某种形式的模块模式?当然,在这种情况下,不必使用
new
调用它。@FelixKling在模块模式中,您会立即调用它,因为要求客户端免费调用函数是没有意义的。您应该能够只
var module=require(“模块”)而不是
var模块=require(“模块”)()我明白了。我从来没有真正使用过它,所以在我看来它很相似:)编写这样的函数通常是在你想要构建一个对象的时候完成的。大写字母和
new
确实建议将其用作构造函数,但是(本例)如果作为普通函数调用,其工作原理相同