2013-04-11 43 views
0

我正在將所有JavaScript類轉換爲Backbone模型。最初,當我在Google Chrome中使用Javascript調試器時,我的對象將顯示爲類型DataNodeBackbone.js在擴展後將對象重命名爲「child」

這是之前的代碼示例。

var DataNode = { name: function() { return "hello world"; } }; 

將其轉換爲主幹模式後,它現在出現在調試器child

現在和Backbone模型一樣。

var DataNode = Backbone.Model.extend({ name: function() { return "hello world"; } }); 

當我查看變量DataNode鉻說,這是類型爲child,而不是DataNode像以前一樣。

現在對於從骨幹模型擴展的所有對象都在發生這種情況。現在有點痛苦,因爲當我有一堆模型時,我不知道哪個是哪個模型。

回答

3

歡迎來到JS中類名的問題。

事實上發生的事情是,你的班級實際上沒有任何名字。在這種情況下,您的瀏覽器將嘗試爲您的日誌提供適當的名稱。如果你沒有做任何複雜的事情,就像你以前那樣做,那就是創建一個類,實例化一個對象,你的瀏覽器將看不到任何類名,並且通常給它一個包含這個類的var的名字。

你可能會想(認爲):

var MyClass = function() {}; 

var MyClass = function MyClass() {}; 

是相同的。你錯了。第二是唯一的方法(據我所知)給你的班級一個名字。嘗試在兩種情況下:console.log((new MyClass).constructor.name)。第一個會給你一個空字符串,第二個會給你MyClass。

現在不要被愚弄。你可能會想:「我只需要設置constructor.name」。構造函數屬性的每個屬性都受到保護,您不能自己設置它們。所以這是問題。用Backbone創建類的方式,我不能想到設置類名(或者eval,但不要)。

所以我在說什麼,就是你的事業失敗了。再次,我不知道關於JS的一切,可能會錯過一些東西。

如果你有興趣瞭解更多關於功能的constructor屬性:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function

+0

你知道的比我多。這是一個很好的答案。謝謝。 – cgTag 2013-04-11 18:40:13

1

看來你其實可以用一個命名函數表達式覆蓋constructor屬性,如Debugging Javascript (Backbone and Marionette)問題由丹·馬爾科姆描述。相關代碼片段:

var Product = Backbone.Model.extend({ 
constructor: function Product() { 
    Backbone.Model.prototype.constructor.apply(this, arguments); 
} 
}); 

關鍵是function Product()部分。 Here是它在源的擴展函數中發生的位置。

+0

你會使用'Product.prototype.constructor。應用(this,arguments);'在Product的子類中?另外,如果Product沒有覆蓋構造函數,你會在Product的子類中做什麼? – 2016-03-23 20:21:07