1

我一直在使用 Javascript,但更多的是程序方式而不是面向对象的方式。最近,我刚刚开始以 OOP 方式学习 Javascript。任何人都可以告诉有什么区别:

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

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

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

4

3 回答 3

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)来编写,以将它们与常规对象或变量区分开来。

于 2012-05-29T04:14:09.820 回答
2

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

于 2012-05-29T04:14:23.447 回答
2

在第一种情况下,您使用对象字面量定义对象。从 OOP 的角度来看,它是一个单例。

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

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

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

如果使用关键字myConstructor调用它,new

  • 将创建一个新对象
  • myConstructor将使用thisset 运行以引用这个新对象,因此fieldandmethod属性将被附加到它上面
  • 新对象将被返回

例子:

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 的类)本身中,并且不需要实例化来访问它们。

于 2012-05-29T04:38:55.297 回答