2012-06-25 128 views
0

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

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();​ 
+0

这是指最接近的绑定对象实例,在这种情况下,这将是窗口。你的代码应该做什么? –

+1

https://developer.mozilla.org/en/JavaScript/Reference/Operators/这个 –

+0

'this'从来没有指向函数本身,除非你明确*设置它:'func.call(func)'。 –

回答

2

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

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(); 
+0

谢谢。有人将我链接到一个mozilla页面,这似乎很好地解释了这一点。我猜这个''只能像'new'构造函数那样工作,并且会在匿名函数中引用'window'。 –