这种创建对象的方法是否仅适用于单例对象?

时间:2011-11-04 06:35:08

标签: javascript javascript-objects

我正在阅读道格拉斯·克罗克福德写的一些代码。他使用以下结构创建对象。

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();

我不喜欢构造函数的方法,因为您需要使用__来表示私有字段或方法(这并不会使字段成为私有),您需要使用此关键字来访问任何字段或方法。我喜欢第一种方法,但我不知道如何使用它来定义多个对象。

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

2 个答案:

答案 0 :(得分:0)

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

在函数中返回一个函数而不是object literal:

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()。不确定两者之间的含义是什么,但我通常只使用一个函数。

答案 1 :(得分: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/