代码之家  ›  专栏  ›  技术社区  ›  TimDog

如何在Javascript中正确创建新的Person对象?

  •  1
  • TimDog  · 技术社区  · 14 年前

    ;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”,但是当 函数被调用。这个 new 显示私人

    如何确保闭包是具有公开方法的可重用对象?我正在使用(function(){//object code})();语法,以确保变量的作用域仅限于正在创建的对象。谢谢!

    4 回复  |  直到 14 年前
        1
  •  3
  •   house9    14 年前

    这是使用douglascrockford的“JavaScript:thegoodparts”中的技术 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/

        2
  •  0
  •   TimDog    14 年前

    showPrivate 构造函数中的函数--确保函数是公共的:

    ;Person2 = (function() {
        var prName = 'private';
        return function(fname, lname) {
            this.FirstName = fname;
            this.LastName = lname;
            this.showPrivate = function() { alert(prName); };
        }
    })();
    
        3
  •  0
  •   steve_c    14 年前

    您希望使用prototype方法来创建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;
        }
    
    })();    
    

    我不太清楚你想在这里完成什么。你的问题有点让人困惑。也许你想改写一下?

        4
  •  0
  •   PDA    11 年前
    //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;
            }
        };
    };