了解Javascript中的功能范围,`this`和OO设计模式

时间:2012-06-25 12:15:07

标签: javascript oop design-patterns

一段时间以来,我一直在使用objectOne的设计模式,如下所示。我不记得我把它拿起来了。我试图找到它但不能。也许是我读到的一些混合物。今天我发现它非常有缺陷,因为this正在解析窗口对象,使所有公共方法都是全局的。我的印象是,当函数中使用this时,它将引用函数本身,而不是全局窗口对象。我想情况并非如此?有人可以解释一些我缺少的东西或者指向一个解释它的资源吗?我也对修复此模式或找到一个与全局方法名称没有此问题的类似模式感兴趣。我想如果我使用this以外的变量,也许是fn,我会返回它,那么它会解决问题。提前感谢您对这个问题的任何帮助,对不起它有点模糊。

JS小提琴: http://jsfiddle.net/nLL8y/3/

myapp = {};

myapp.objectOne = function() {
    var that = this,
        p = {};

    this.public = function() {
        console.log(this);
    };

    p.private = function() {};

    return this;
}();

myapp.objectTwo = {
    public: function() {
        console.log(this);
    },

    notPrivate: function() {}
};

myapp.objectThree = function() {
    var fn = {},
        p = {};

    fn.public = function() {
        console.log(this);
    };

    p.private = function() {};

    return fn;
}();

//creates global functions
myapp.objectOne.public();
//doesn't allow private
myapp.objectTwo.public();​
//seems to work
myapp.objectThree.public();​

1 个答案:

答案 0 :(得分:2)

myapp在您的示例中用作命名空间。 objectOneobjectTwo是构造函数,所以它们应该以大写字母开头。但是你最大的问题是直接使用方法而不是创建对象:

var myapp = {};

myapp.ObjectOne = function() {
    this.public = function() {
        console.log(this);
    };
    var private = function() {};
};

myapp.ObjectTwo = function() {
    this.public = function() {
        console.log(this);
    },

    this.notPrivate = function() {}
};


var o1 = new myapp.ObjectOne();
o1.public();

var o2 = new myapp.ObjectTwo();
o2.public();