2011-11-04 82 views
0

我正在阅读Douglas Crockford编写的一些代码。他使用下面的结构来创建对象。创建对象的方法只适用于单例对象吗?

var obj = (function(){ 
    var x, y, z; // These are private fields 

    // This is private method 
    function func1() { 
    } 

    return { 
     // This is public method 
     init : function() { 
     } 
    }; 
}()); 

我喜欢这种方式,而不是像下面的构造函数。

function Obj() { 
    // Uses __ to denote private 
    this.__x = 0; 
    this.__y = 0; 
    this.__z = 0; 

    // Private method 
    this.__func1 = function() { 
    }; 

    // Public method 
    this.init = function() { 
    } 
} 
var obj = new Obj(); 

我不喜欢的构造函数方法需要使用__表示为私有字段或方法(这并不真正使外地私营),你需要使用该关键字访问任何领域或方法。我喜欢第一种方法,但我不知道如何使用它定义多个对象。

我们可以在第一个方法中定义多个对象还是只能用于创建单例对象?

+0

您的意思是多个对象,因为在许多obj实例中? – adriaanp

+0

@adriaanp是的我的意思是多个实例 – Cracker

回答

0

要实例化新对象,您需要使用需要使用函数作为构造函数的new关键字。我看到2个选项:

返回一个函数,而不是对象的功能文字:

var obj = (function(){ 
    var x, y, z; // These are private fields 

    // This is private method 
    function func1() { 
     console.log("func1"); 
    } 

    return function() { 
     // This is public method 
     this.init = function() { 
      func1(); 
     } 
    }; 
})(); 

或者不使用自执行的函数:

var obj = function(){ 
    var x, y, z; // These are private fields 

    // This is private method 
    function func1() { 
     console.log("func1"); 
    } 

    return { 
     // This is public method 
     this.init = function() { 
      func1(); 
     } 
    }; 
}; 

都让我们这样做VAR newObj = new obj()。不知道这两者之间有什么影响,但我通常只是使用一个函数。

+0

不知道这可能有助于http://www.crockford.com/javascript/private.html – adriaanp

0

只是需要注意的是:

this.__x 

不作X私人(除可能按照惯例,即人学不使用)

而:

function Obj() { 
    // private 
    var x = 0; 
    var __y = 0; 

    // public 
    this.z = 0; 

    // Private method 
    function func1() { 
    }; 

    // Public method 
    this.init = function() { 
    } 
} 

我发现此链接对您有帮助:http://www.phpied.com/3-ways-to-define-a-javascript-class/