我想我不太了解Require.js,所以我想问为什么我可以改变firstName和lastName,如下例(全局)中那样。
不应该要求.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());
});
});
输出结果为:
约翰·多伊
其他一些姓氏其他姓氏
答案 0 :(得分:2)
我认为你将全球泄密与财产的可见性混为一谈。 firstName
和lastName
并非泄露 - 它们只是公开可访问且可修改(可变)。如果你想隐藏它们,你可以这样做:
function Employee(firstName, lastName) {
this.getFirstName = function () { return firstName; };
this.getLastName = function () { return lastName; };
}
Employee.prototype.getName = function () {
return this.getFirstname() + ' ' + this.getLastName();
};
答案 1 :(得分:1)
你没有在这里规范任何全局范围 - 你的代码在匿名函数(闭包)内运行,没有任何东西绑定到窗口全局对象 - 所以没关系。
答案 2 :(得分:1)
您创建的对象具有“firstName”和“lastName”属性。您的代码没有阻止对这些属性的修改。
在较新的JavaScript实现中,有很多方法可以做到这一点,但是Requirejs不会自动执行(至少没有重大的重新设计或增强项目)。
具体来说,defineProperty
方法允许您创建只读属性。现在,这将阻止所有代码修改属性。如果你想要对象控制的属性,你可以使用@ c24w在另一个答案中建议的技术。