2013-03-21 44 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