Этот метод создания объектов применим только для одноэлементных объектов? - PullRequest
0 голосов
/ 04 ноября 2011

Я просматривал код, написанный Дугласом Крокфордом.Он использует следующую структуру для создания объектов.

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 голосов
/ 07 декабря 2011

Просто обратите внимание, что:

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/

0 голосов
/ 04 ноября 2011

Для создания новых объектов вам нужно использовать новое ключевое слово, которое должно использовать функцию в качестве конструктора.Я вижу 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 ().Не уверен, каковы последствия между ними, но я обычно просто использую функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...