这2个javascript有什么区别?

时间:2012-05-29 04:10:50

标签: javascript jquery

我一直在使用Javascript,但更多的是以程序方式而不是面向对象的方式。最近,我刚刚开始以OOP方式学习Javascript。任何人都能说出它们之间的区别:

var foo = {
   method1 : function(){
  }
}

var foo = function(){
   method: function(){
  }
}

这两者是否相同或是第一个静态类?如果两者都相同,那么我的第二个问题是如何编写方法并静态调用它?

3 个答案:

答案 0 :(得分:2)

第一个可以被认为是静态类,例如你可以致电foo.method1()

第二个是纯粹的错误,会导致语法错误。

编写静态类以供重用的一种方法是使用module pattern

var Foo = (function() {
    var private_variable = 1;

    function private_function() {
        return private_variable + 5;
    }

    return {
        get_private_variable: function() { return private_variable; },
        run_private_function: function() { return private_function(); }
    }
}());

Foo.get_private_variable(); // returns 1
Foo.get_private_function(); // returns 6

顺便说一句,上面的静态类通常用标题大小写(Foo而不是foo)来区分它们与常规对象或变量。

答案 1 :(得分:2)

主要之间的区别在于第二个是不正确的,没有任何意义。如果您运行它,则会看到SyntaxError: Unexpected token (

答案 2 :(得分:2)

在第一种情况下,使用对象文字定义对象。从OOP的角度来看,它是一个单身人士。

var myObject = {
    field: value,
    method: function() { }
}

另一个在语法上是不正确的。然而,该代码可能想要的类似于构造函数。

var myConstructor = function() {
    this.field = value;
    this.method = function() {};
}

如果使用myConstructor关键字调用此new

  • 将创建一个新对象
  • myConstructor将设置this设置为引用此新对象,因此fieldmethod属性将附加到其中
  • 将返回新对象

示例:

var myObject = new myConstructor();

myConstructor()构造的每个新对象实例都将收到自己的函数method的副本。这种方式prototype通常用于存储函数,但这超出了这个问题的范围。

对于静态方法,可能是将其直接添加到构造函数中。这是可能的,因为函数在JS中也是对象。想象一下这个例子。

var myConstructor = function() {
   // keep track of this instance
   myConstructor.addInstance(this);
}

myConstructor.instances = new Array();

myConstructor.addInstance = function(obj) {
    myConstructor.instances.push(obj);
}

myConstructor.getInstances = function() {
    return myConstructor.instances;
}

var myObject1 = new myConstructor();
var myObject2 = new myConstructor();
alert(myConstructor.getInstances()); // [object Object],[object Object]

在这种情况下,构造函数包含一个包含所有现有实例和方法的数组来操作它。这些字段和方法可以被认为是myConstructor的静态属性,因为它们包含在构造函数中(它替代了经典OOP的类)本身,并且不需要实例化来访问它们。