簡體   English   中英

為什么我可以修改模塊內命名返回對象的屬性,但不能修改對象本身?

[英]How come I can modify the properties of a named return object inside of a module, but not modify the object itself?

這是來自 YDKJS Scope & Closures 中的一個示例:

   var foo = (function CoolModule(id) {
        function change() {
            // modifying the public API
            publicAPI.identify = identify2;
        }
        function identify1() {
            console.log(id);
        }
        function identify2() {
            console.log(id.toUpperCase());
        }
        var publicAPI = {
            change: change,
            identify: identify1
        };
        return publicAPI;
    })("foo module");
    
    foo.identify(); // foo module
    foo.change();
    foo.identify(); // FOO MODULE

在函數change() ,我通過將不同的函數分配給“identify”鍵來修改返回對象的內容。 實際上,我可以將任何鍵的值更改為這樣的任何值:例如, publiAPI.change = null; 我什至可以通過這種方式添加新屬性,例如publicAPI.newFunc = function(){console.log("hi");} 但是,我不能執行publicAPI = {}或設置 publicAPI 對象本身,例如publicAPI = {a: 1} 為什么會這樣? 有沒有辦法修改對象本身? 我什至可以使用 delete 運算符來刪除屬性。

但是,我不能執行publicAPI = {}或設置publicAPI對象本身,例如publicAPI = {a: 1}

是的你可以。 它對foo根本沒有影響。

為什么會這樣?

因為當你這樣做時:

return publicAPI;

返回的是publicAPI,而不是對變量的引用。 該值是對象引用。 如果稍后更改publicAPI變量中的值,則不會影響任何已收到變量先前值的內容。

有沒有辦法修改對象本身?

您分配給identify屬性的示例會更改對象(例如,更改對象屬性之一的狀態)。 但改變foo所指對象的唯一方法是分配給foo 您對publicAPI任何事情publicAPI能改變對象foo所指的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM