2013-07-02 71 views
0

我試圖分配使用下面的一個命名空間中的原型,(一切都被包裹在一個全局對象):使用命名空間將原型對象分配給對象中的匿名函數,這是未定義的?

prototypeObjects:{

 Person : function(config){ 

      var that = this; 

      this.name = config.name; 
      this.age = config.age; 

      console.log(that); 

      that.prototype.working = function(){ 

       console.log(this.name + 'is working'); 

      }; 

    }, 

},

我然後在控制檯中使用它來檢查它:

var me = new global.prototypeObjects.Person({name:'Mike',age:'40'});

這給這個錯誤:但不能設置屬性未定義

'工作',我若在指定的原型,即是明確的:

類型錯誤

prototypeObjects:{

 Person : function(config){ 

      var that = this; 

      this.name = config.name; 
      this.age = config.age; 

      console.log(that); 

      **global.prototypeObjects.Person**.prototype.working = function(){ 

       console.log(this.name + 'is working'); 

      }; 

     } 



    }, 

然後它按預期工作,我得到以下內容:

global.prototypeObjects.Person {名: 「邁克」,年齡 「40」,工作:功能}

和me.working()註銷 '邁克正在'

有人可以解釋爲什麼我在這種情況下不能使用'this'?

回答

1

您定義構造函數體內的原型函數,你應該定義函數體外面的原型功能:

var global={}; 
global.pototypeObjects= { 
    Person : function(config){ 
    this.name = config.name; 
    this.age = config.age; 
    } 
}; 
global.pototypeObjects.Person.prototype.working=function(){ 
    console.log(this.name + " is working"); 
}; 
var p = new global.pototypeObjects.Person(
    {name:"jon",age:22} 
); 
p.working();//jon is working 

以下是有關原型的一些基本的解釋和建立繼承:Prototypical inheritance - writing up

這是最好不要在構造函數中使用var,因爲它們會創建閉包,這些對象需要更多的cpu來初始化和更多的內存。

+0

標記爲正確的細節和外部鏈接。現在完美工作,謝謝你,先生! –

+0

+1,但在構造函數中使用「var」與是否創建閉包無關。閉包是創建超出封閉範圍的功能的結果。 – RobG

+0

@RobG閉包是函數的返回值,該函數具有與其關聯的環境,以適應函數中聲明的變量,並且函數返回時var不會超出範圍。如果我有'var name =「」'親自創建一個新人(),那麼返回的是一個閉包,因爲一個環境與人關聯以使'name'可用。 – HMR

0

因爲您已經實例化了該對象。 prototype存在於類中,而不是對象。你可以只是做:

this.working = function() {} 

否則,你應該把它移動的構造之外。

+0

完美,謝謝你的快速回答。 –

+1

爲什麼要在構造函數體中聲明一個函數?該功能對每個人的實例都是一樣的,所以應該可以共享,但是這樣每個人實例都有它自己的工作函數,這將需要額外的cpu來初始化和更多的內存來存儲。 – HMR

相關問題