2012-06-25 81 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'。 –