2015-04-06 51 views
2

我試圖在JavaScript文件中使用顯示原型模式來封裝兩個相關函數的集合。但是當頁面加載時,它會在調用.init函數時返回以下錯誤:使用顯示原型模式時出現「未定義不是函數」錯誤

「Uncaught TypeError:Undefined不是函數。」

這是我的標記模式。

<script> 
    $(function() { 
     testProto1.init(); 
     testProto2.init(); 
    }); 
</script> 

這裏是我的JavaScript文件中的模式。

var testProto1 = function() { 

}; 

testProto1.prototype = function() { 
    var init = function() { 
     alert("init 1"); 
    }; 

    return { 
     init: init 
    } 
}(); 


var testProto2 = function() { 

}; 

testProto2.prototype = function() { 
    var init = function() { 
     alert("init 2"); 
    }; 

    return { 
     init: init 
    } 
}(); 

這可能是我的一些基本的語法錯誤,如果它是重複的,我很抱歉。爲什麼我看到這個錯誤,我該如何解決?謝謝。

+2

請描述你真正想要完成的事情。這段代碼看起來有很多不同的方式,但我不確定你實際上想做什麼,所以不知道該怎麼建議。 'testProto1.init()'不起作用,因爲'testProto1'構造函數沒有'.init()'屬性。 – jfriend00

+0

@ jfriend00,我的意圖是命名空間我正在使用的功能。一組函數處理網格,另一組處理數學計算。這種模式不是混合各種功能,而是將功能封裝在邏輯單元下。 –

+0

如果你只是想命名一些實際上不是實例化對象的方法的函數,那麼你完全不使用原型。您只需將屬性放在對象上並調用這些屬性即可。 – jfriend00

回答

3

看起來您正在使用原型012的概念函數實例在很多方面都不正確。

如果您希望能夠訪問原型,則需要instantiate函數與new運算符。

從它看起來像你想實現這一點:

var testProto1 = function() { }; 

// Create your methods in object notation within your prototype 
testProto1.prototype.init = function() { 
    alert('init called'); 
}; 

現在,如果你想打電話這一點,你必須instantiate吧!

var proto1 = new testProto1(); 

// NOW you can call .init! Because the prototype was actually created 

proto1.init(); // alerts 'init called!' 
+0

就是這樣。謝謝!我很久以前就在另一家公司使用過這種模式,並且不再擁有該代碼。這正是我的問題所在。 –

+0

不是問題,祝你好運! @KenPalmer –

1

你可以從這個對象的實例訪問原型的屬性,所以這將工作:

var a=new testProto1(); 
a.init(); 

,如果你想進入電影從testProto1初始化函數,你必須寫:

testProto1.prototype.init(); 

因此您的代碼將如下所示:

$(function() { 
    testProto1.prototype.init(); 
    testProto2.prototype.init(); 
}); 
+0

謝謝奧馬爾。這也起作用。 –

相關問題