【问题标题】:Javascript creation of objectsJavascript创建对象
【发布时间】:2011-07-18 12:05:43
【问题描述】:

我正在创建一个 javascript 对象,它将存储有关登录到我的站点的用户的信息(以便于访问),但对我来说,很难理解在 javascript 中创建对象的方法。我已经看到使用原型方式的示例,以及使用闭包方式的示例,我决定继续使用闭包,因为我只需要该对象的一个​​实例,因此,开销不会很大。

我想知道我所做的是否正确,如果有什么方法可以改进我的代码,这是我的代码:

(function(window){
    var mysite = (function() {
        var me = this;

        return { //public interface
            init : function(userInfo){
                me.user = userInfo;
                return this;
            },
            sayHello : function(){
                return 'Hello, my name is ' + me.user.name + ' and I am ' + me.user.age + ' years old.';
            }
        }
    }());

    window.mysite = function(userInfo){
        return mysite.init(userInfo);
    }
})(window);

var mysite = mysite({name : 'Jonathan', age : 17});
mysite.sayHello();

编辑#1

如果我想在主对象 MySite 中添加子对象,并且这些子对象有自己的方法和属性,以及访问主对象(MySite)的属性和方法,我想做这样的事情:

mysite.timezone.calculeUserTimezone();

如何进行?

【问题讨论】:

    标签: javascript oop closures


    【解决方案1】:

    使用原型

    (function(window) {
        var MySite = function(opt) {
            this.user = opt;
        };
    
        MySite.prototype.sayHello = function() {
            return 'Hello, my name is ' + this.user.name + ' and I am ' + this.user.age + ' years old.';
        };
    
        window.mysite = function(options) {
            return new MySite(options);
        }
    })(window);
    
    var a = mysite({
        name: 'Jonathan',
        age: 17
    });
    console.log(a.sayHello());
    

    我会改用原型方法。你没有利用闭包,所以这种方式更整洁。

    Live Example

    使用闭包

    (function(window) {
        var MySite = function(opt) {
            var user = opt;
    
            this.sayHello = function() {
                return 'Hello, my name is ' + user.name + ' and I am ' + user.age + ' years old.';
            }
        };
    
        window.mysite = function(options) {
            return new MySite(options);
        }
    })(window);
    
    var a = mysite({
        name: 'Jonathan',
        age: 17
    });
    console.log(a.sayHello());
    

    Live Example

    【讨论】:

    • 你没有利用闭包你能更好地解释一下吗?按照您发布的示例,如果我希望用户成为私有财产,我该怎么办?谢谢。
    • @Jonathan 在 JavaScript 中没有私有这样的东西;)我还忘了提到您的代码是一个不断重新初始化的对象,并且不允许您创建多个实例。
    • 但在我的示例中,me.user 无法在关闭之外访问。
    • @Jonathan 为什么这很重要?
    • 因为我不希望使用 firebug 的用户轻松访问此属性,所以我知道 javascript 在实践中是完全公开的,但我想阻止访问此属性。现在最后一个问题,按照你给出的两个例子,如果我有另一个对象(在 mySite 中),它有自己的函数和属性,我该怎么办?
    【解决方案2】:
       var mysite = (function() {
            var me = this;
    
            return { //public interface
                init : function(userInfo){
                    me.user = userInfo;
                    return this;
                },
                sayHello : function(){
                    return alert(me.user.name);
                }
            }
        })();
    
    
    mysite.init({name : 'Jonathan', age : 17});
    mysite.sayHello();
    

    我认为这也很好,因为 mysite 将是一个可以在任何地方访问的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      • 2012-11-20
      • 2012-03-06
      • 2018-05-05
      • 1970-01-01
      相关资源
      最近更新 更多