2016-07-15 61 views
0

可以說我有一個功能 - 對象構造:訪問/修改函數內部的對象| JavaScript的

var constructor = function(name, surname, town){ 
    return { 
     Name: name, 
     Surname: surname, 
     Town: town 
    } 
}; 

現在我可以創建一個新的obj是這樣的:

var peter = constructor("Peter", "Jameson", "London"); 

,我可以以我的新對象peter使用點添加新特性符號是這樣的:

peter.phoneNumber = 856687; 

我的問題是:是否有可能使用點/括號標記多個屬性添加到我的構造函數當構造函數/函數中的對象沒有var時?

+2

目前還不清楚你在問什麼。你的意思是修改'constructor'的代碼,或者在運行時做一些事情? –

+0

供參考:'物種'沒有傳遞給函數。是的,請澄清你的問題。向我們展示你想做什麼,你想如何使用單點/括號表示法 – vaso123

+0

我想用點表示法(如果可能的話)修改構造函數的代碼,例如我想添加更多的屬性給我的構造函數。如果代碼是這樣的: '代碼' 變種構造函數=(姓名,鎮){VAR 人= { 名稱:名稱, 姓:種, 鎮:鎮 }; return person }; 'code' 那麼我想我可以修改我的構造函數,如下所示: {constructor.person.phoneNumber = 554457; 但在我原來的代碼構造函數裏面沒有var所以我不能taget obj – Ziggy

回答

1

這聽起來像你試圖在運行時修改constructor的行爲。你說過:

我想用點符號(如果可能的話)修改構造函數的代碼,例如我想添加更多的屬性給我的構造函數。如果代碼是這樣的:

var constructor = function(name, surname, town){ 
    var person = { Name: name, Surname: species, Town: town }; 
    return person; 
}; 

...然後我想我可以改變我的構造是這樣的:{constructor.person.phoneNumber = 554457;但在我的原代碼,構造函數有沒有變種裏面,所以我不能taget OBJ

正如@deceze指出的那樣,不,即使constructor有一個變量,你也不能這樣做。該變量對函數完全是私有的,它不會作爲constructor的屬性公開。

在運行時修改constructor的行爲的唯一途徑是包裝在一個新的功能,如:

(function() { 
    var original = constructor; 
    constructor = function() { 
     var obj = original.apply(this, arguments); 
     obj.phoneNumber = 554457; 
     return obj; 
    }; 
})(); 

與所有的參數調用原始的版本,它收到(和相同的this),然後添加額外的屬性,並將其返回。


好吧,技術上,你可以用toString編譯它(在支持它的瀏覽器;支持現在需要爲ES5的,所以這是相當不錯的),使用文本操作來更改其內容,然後使用new Function將它變回函數並將結果賦值給constructor,但是A)這是一個非常糟糕的主意,並且B)該函數將失去其上下文,因此如果它依賴於關閉任何變量,全局變量,它會停止工作(因此[A])。

+0

這是我一直在尋找的答案,謝謝! – Ziggy