2013-03-21 90 views
1

我想我不太瞭解Require.js,所以我想問我爲什麼可以像下面的例子(全局)那樣更改firstName和lastName。Requirejs並避免污染全球範圍

不應該Require.js做一些有關避免污染全球範圍的東西嗎?我只是提供創建對象的界面,而不是改變它的內容。非常感謝。

// someModule.js 
define([], function() { 
    function Employee(firstName, lastName) { 
     this.firstName = firstName; 
     this.lastName = lastName;   
    } 

    Employee.prototype.getName = function() { 
     return this.firstName = ' ' = this.lastName; 
    } 

    return { 
     createEmployee: function(fName, lName) { 
      return new Employee(fName, lName); 
     }; 
    }; 
}); 

// main.js 
require(['jquery', 'someModule'], function($, someModule) { 
    $(function() { 
     var x = someModule.createEmployee('John', 'Doe'); 
     document.write(x.getName() + '<br>'); 
     x.firstName = 'Some other name'; 
     x.lastName = 'Some other surname'; 
     document.write(x.getName()); 
    }); 
}); 

,輸出是:
李四
其他一些名其他一些姓氏不在此處polute任何全球範圍內

+5

更好地發佈你的代碼,而不是鏈接到圖像。 – 2013-03-21 17:49:27

回答

2

我認爲你在混淆全局泄漏和屬性可見性。 firstNamelastName不是泄露 - 它們只是公開訪問和可修改的(可變的)。如果你想隱藏它們,你可以這樣做:

function Employee(firstName, lastName) {  
    this.getFirstName = function() { return firstName; }; 
    this.getLastName = function() { return lastName; }; 
} 

Employee.prototype.getName = function() { 
    return this.getFirstname() + ' ' + this.getLastName(); 
}; 
+0

該鏈接已更改爲[瞭解JavaScript OOP](http://killdream.github.io/2011/10/09/understanding-javascript-oop.html) – Vlad 2013-11-23 14:38:24

+0

這兩個鏈接現已停止,我無法找到鏡像,所以刪除它:( – c24w 2014-01-07 10:53:30

+0

該帖子的緩存副本可用[這裏](http://web.archive.org/web/20131120224629/http://killdream.github.io/2011/10/09/understanding -javascript-oop.html)。 – c24w 2014-10-28 14:30:16

1

- 你的代碼匿名函數(關閉),並沒有什麼內部運行是綁定到窗口全局對象 - 所以沒關係。

1

您創建的對象具有屬性「firstName」和「lastName」。您的代碼不會阻止對這些屬性的修改。在新的JavaScript實現中,有一些方法可以做到這一點,但是Requirejs不會自動執行它(至少不是沒有重大的重新設計或增強項目)。

具體而言,defineProperty方法允許您設置只讀屬性。現在,這將阻止所有代碼修改屬性。如果你想要屬性受到對象的控制,你可以使用像@ c24w在另一個答案中所暗示的技術。

+0

你可以給我說明如何保護員工的屬性免受直接訪問?謝謝。 – Srle 2013-03-21 17:52:52

+0

當使用'defineProperty'或'defineProperties'時,將'writable'鍵設置爲false是一個很好的解決方案(如果向後兼容性不是問題)。 – c24w 2013-03-22 09:57:34