2013-07-30 149 views
0

我有一個原型函數的JavaScript ...我想能夠從該原型函數調用另一個函數。從原型函數調用函數

var objMap = new Map(500,500); 
var myCities = objMap.genValues(5); 

function Map(sizeX, sizeY) { 
    this.sizeX = sizeX; 
    this.sizeY = sizeY; 
} 
Map.prototype = { 
    genValues: function (number) { 
     validateValues(number); 
    } 
} 

function validateValues(num){ 
    alert(num); 
} 
在我的控制檯

我得到以下錯誤:

SCRIPT438: Object doesn't support property or method 'genValues'

當我不函數調用添加到validateValues我沒有得到這個錯誤。 有沒有辦法做到這一點?我希望能夠以遞歸方式調用函數。

更新!

我在下面的代碼中修復了我的代碼fiddle:我仍然得到相同的錯誤。
這聽起來像我正在使用原型功能/方法不正確,因爲我不能從內部調用函數?是對的嗎?

+1

您缺少結束'}'來結束'genValues'。 –

回答

1

在分配原型之前,您正在構造Map實例;並且在創建它之前調用該方法。在該分配後實例化的對象將具有genValues方法。兩個修復程序:

function validateValues(num){ 
    alert(num); 
} 

function Map(sizeX, sizeY) { 
    this.sizeX = sizeX; 
    this.sizeY = sizeY; 
} 
// alter the existing prototype object instead of overwriting it 
Map.prototype.genValues = function (number) { 
    validateValues(number); 
} 

// create instances only after the "class" declaration is done! 
var objMap = new Map(500,500); 
var myCities = objMap.genValues(5); 
+2

作爲OP的好處的附錄:在聲明函數Map(){...}之前'new Map()'工作的原因是因爲函數聲明[懸掛在它們包含函數的頂部](http: //www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html)。然而,雖然'Map'構造函數被掛起了(因此'Map'可以在聲明的相同函數的任何地方隨意使用,之前或之後),Map.prototype的賦值*不會被提升,所以' Map.prototype.genValues'僅在分配後可用*。 – apsillers

+0

@apsillers:感謝您的鏈接,我沒有時間去尋找一個好的。 – Bergi

+0

@apsillers爲什麼沒有'Map.prototype'懸掛?這會被吊起來嗎?Map.prototype.genValues = function(){}'? – neurosnap