Как я могу правильно создать новый объект Person в Javascript? - PullRequest
1 голос
/ 27 мая 2010

Я все еще борюсь с этой концепцией. У меня есть два разных объекта Person, очень просто:

;Person1 = (function() {
    function P (fname, lname) {
        P.FirstName = fname;
        P.LastName = lname;
        return P;
    }
    P.FirstName = '';
    P.LastName = '';
    var prName = 'private';
    P.showPrivate = function() { alert(prName); };
    return P;
})();

;Person2 = (function() {
    var prName = 'private';
    this.FirstName = '';
    this.LastName = ''; 
    this.showPrivate = function() { alert(prName); };
    return function(fname, lname) {
        this.FirstName = fname;
        this.LastName = lname;
    }   
})();

И скажем, я вызываю их так:

var s = new Array();

//Person1
s.push(new Person1("sal", "smith"));
s.push(new Person1("bill", "wonk"));
alert(s[0].FirstName);
alert(s[1].FirstName);
s[1].showPrivate();

//Person2
s.push(new Person2("sal", "smith"));
s.push(new Person2("bill", "wonk"));
alert(s[2].FirstName);
alert(s[3].FirstName);
s[3].showPrivate();

Person1 устанавливает оповещения «счет» дважды, затем оповещает «частный» один раз - поэтому он распознает функцию showPrivate, но локальная переменная FirstName перезаписывается.

Второй Person2 устанавливает оповещения "sal", затем "bill", но происходит сбой при вызове функции showPrivate. Ключевое слово new здесь работает так, как я и ожидал, но showPrivate (который я считал публичной функцией внутри замыкания), по-видимому, не публично.

Как я могу убедиться, что мое закрытие является объектом многократного использования с открытыми методами? Я использую (function () {// объектный код}) (); синтаксис, гарантирующий, что мои переменные будут видны только для создаваемого объекта. Спасибо!

Ответы [ 4 ]

3 голосов
/ 27 мая 2010

это использование техники Дугласа Крокфорда "JavaScript: хорошие детали" http://oreilly.com/catalog/9780596517748

Глава 5: Наследование - раздел «Функциональные»

var personConstructor = function (spec) {
    var that = {};

    that.fullName = function () {
            return spec.first_name + " " + spec.last_name;
    };

    that.setFirstName = function (firstName) {
            spec.first_name = firstName;
    };

    return that;
};

var john = personConstructor({first_name: "John", last_name: "Doe"});
var jane = personConstructor({first_name: "Jane", last_name: "Doe"}); 

alert(john.fullName()); // John Doe
alert(jane.fullName()); // Jane Doe

john.first_name = "OVERWRITE";
alert(john.fullName()); // John Doe

john.setFirstName("OVERWRITE-VIA-SETTER");
alert(john.fullName()); // OVERWRITE-VIA-SETTER Doe

соберите это вместе на jsfiddle, ссылка ниже, если вы хотите протестировать диск, следите за 4 предупреждениями, когда страница загружается

http://jsfiddle.net/SecKg/

0 голосов
/ 30 ноября 2013
//this would allow for instance:
//  john.setName('first', 'Johnny');
//  jane.setName('last', 'Smith');
var personConstructor = function (spec) {
    return {
        fullName: function () {
            return spec.first_name + " " + spec.last_name;
        },
        setName: function (nameType, name) {
            spec[nameType+'_name'] = name;
        }
    };
};
0 голосов
/ 27 мая 2010

Я изменил Person2, чтобы объявить функцию showPrivate в конструкторе - чтобы функция была общедоступной:

;Person2 = (function() {
    var prName = 'private';
    return function(fname, lname) {
        this.FirstName = fname;
        this.LastName = lname;
        this.showPrivate = function() { alert(prName); };
    }
})();
0 голосов
/ 27 мая 2010

Вы хотите использовать метод-прототип для создания объектов Person.

;(function(){
    function Person(firstName, lastName) {
        this.firstName = firstName;
        this.lastName = lastName;

        function showPrivate() {
            alert(this.firstName);
        }
    }

    Person.prototype.getName = function() {
        return this.firstName + ' ' + this.lastName;
    }

})();    

showPrivate будет закрытым, поскольку он создается внутри конструктора. Функция getName является общедоступной и может вызываться извне объекта Person.

Я не совсем уверен, чего вы здесь добиваетесь. Ваш вопрос немного сбивает с толку. Может быть, попытаться перефразировать?

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