2010-10-28 139 views
2

我正在使用jQuery插件。它在WebKit的偉大工程,但是當我嘗試在Firefox我碰到下面的Firefox錯誤:在JavaScript中,什麼是構造函數?而什麼不是?

google.maps.Geocoder is not a constructor 
$('.to, .from').geo_autocomplete(new google.maps.Geocoder, { 

這裏是所有的jQuery:

$('.to, .from').geo_autocomplete(new google.maps.Geocoder, { 
mapkey: 'ABQIAAAAbnvDoAoYOSW2iqoXiGTpYBT2yXp_ZAY8_ufC3CFXhHIE1NvwkxQNumU68AwGqjbSNF9YO8NokKst8w', 
selectFirst: false, 
minChars: 3, 
cacheLength: 50, 
width: 235, 
scroll: true, 
scrollHeight: 330 
}); 

什麼是構造函數和howcome Firefox是它指向了對我來說?

http://dev.resihop.nu是網站

回答

5

任何本地函數都可以作爲構造函數調用(即使它不是被設計爲)。任何不可調用的東西也不能成爲構造函數。例如new 3給出了相同的錯誤。

在您的網頁,google.maps.Geocoder簡直是undefined,這當然是沒有什麼幫助。縱觀谷歌的maps script它的失敗,因爲它是用document.write這樣做,有你正在做的是從包括在分析時,不能使用DOM腳本進口的HTML文檔中的<script>運行的方法來加載地理編碼模塊這裏。

這當然並不指望從通過客戶端XSLT頁面加載運行。這會給你帶來很多瀏覽器問題和零SEO的存在。這種瘋狂的目的是什麼?

+0

嚴格來說,規範說'new'調用'[[Construct]]'內部方法,而普通函數調用使用'[[Call]]'。現在我說我不知道​​什麼樣的事情會有一個,但不是另一個,但也許通過全局名稱空間暴露的東西可能 - 「新setTimeout()」做什麼? – Pointy 2010-10-28 16:00:12

+0

是的,這就是爲什麼我說* native *函數。 :-)其實我認爲根據ECMA262-5,*內建函數不能用作構造函數,不應該有'[[Construct]]','TypeError'也應該。實際發生的事情高度依賴於瀏覽器和功能。歌劇似乎正確。 Chrome調用'new encodeURIComponent('x')'作爲構造函數(返回新的Object,因爲返回的字符串不是對象)。Firefox不同(例如'new setTimeout'給出了一個不同的內部錯誤;'new encodeURIComponent('x')'返回字符串!)。總結:啊! – bobince 2010-10-28 16:16:29

+0

感謝您的信息,雖然我不知道如何解決這個問題,但是你讓我開始了atleast! – Himmators 2010-10-29 09:28:20

6

構造函數是函數(它返回函數名的類型的對象),當您在與該功能的名稱一起使用new時調用,如:

function Person(name, age) { 
    //blah 
} 

var me = new Person("Jacob", 20); 
+1

'new'會導致給定的函數作爲構造函數被調用,即使你忽略了尾部的'()';這是JavaScript奇怪的語法怪癖之一。這裏的問題比缺少括號更基本。 – bobince 2010-10-28 15:32:39

+1

這不是通過參考。它使用'new'關鍵字調用構造函數並傳遞零參數。不需要參數的構造函數不需要括號。 – user113716 2010-10-28 15:33:28

1

您MSUT使用google.maps.geocoder這樣的:

$('.to, .from').geo_autocomplete(new google.maps.Geocoder({ 
    mapkey:'ABQIAAAAbnvDoAoYOSW2iqoXiGTpYBT2yXp_ZAY8_ufC3CFXhHIE1NvwkxQNumU68AwGqjbSNF9YO8NokKst8w', 
    selectFirst: false, 
    minChars: 3, 
    cacheLength: 50, 
    width: 235, 
    scroll: true, 
    scrollHeight: 330 
})); 
1

當你實例化一個對象,如創建一個對象的實例,構造函數是在對象中調用的第一個方法。

當你調用

new google.maps.Geocoder 

...您正試圖通過使用new關鍵字實例化對象的參數的構造函數。在這種情況下,Geocoder不是一個可以不帶參數實例化的類,或者根本就不是。

相關問題