2012-09-19 45 views
-1

所以說,我有一個函數,像這樣:JavaScript命名空間函數/類?

function Moo() 
{ 
    this.someVal = 'blah'; 

    return this; 
} 

Moo.prototype = 
{ 

} 

如果我從這個類做的實例化一個對象:

var moo = new Moo(); 

console.log(moo); 

我得到這個控制檯,而不是與someVal

對象
Window www.domain.com 
+4

你描述的沒有意義。如果你在'Moo'構造函數內部使用'this',或者說'Moo.prototype.foo()'方法,它會引用Moo'的實例。請展示一個實際有問題的代碼示例,描述你期望發生的事情,以及發生了什麼*。 – JAAulde

+0

我想OP是問他如何設置一個'myNameSpace.Moo'構造函數。 –

+0

是的,我更好地更新了它,它是窗口對象不是父對象的任何這個。 – Rob

回答

0

我不確定我是否理解這個問題,但這裏有一個解釋可能會有所幫助。

在普通的JavaScript(即ECMAScript中)中,當一個函數被調用與new操作者,其this引用彷彿其內部[[Prototype]]集到構造的公共prototype對象創建由new Object()一個新對象。

這是返回的新對象(不需要return this,這是默認操作),除非返回其他對象。

當一個函數被調用時,它的this完全由該調用設置,上下文(即範圍)是不相關的。

所以:

function Moo() { 
    // if called with new, this references a new object 
} 

// Assign a new object to Moo.prototype, 
// replacing the default object given to all functions 
Moo.prototype = { 
    someMethod: function() {...}, 
    ... 
} 

// Create an instance of Moo 
var moo = new Moo(); 

// Call a method 
moo.someMethod();  

在最後一行中,內someMethodthis將引用moo對象,但完全是基於該方法如何被調用,它無關moo是如何構造或它被稱爲的上下文。

例如如果someMethod被稱爲如下:

var x = moo.someMethod; 

x(); 

this價值尚未確定,所以在someMethod它會默認爲全球(窗口)對象,或者在嚴格的模式,它是不確定的。

請注意,上述情況與呼叫的上下文無關,this是動態的,並且完全由呼叫設置(忽略ES5 bind)。