Javascript 要求和避免污染全球范围
我想我不太理解Require.js,所以我想问一下为什么我可以像下面的例子(全局)那样更改firstName和lastName 不应该要求.js做一些避免污染全球范围的事情吗?我只是提供了创建对象的接口,而不是更改对象的内容。非常感谢Javascript 要求和避免污染全球范围,javascript,module,requirejs,Javascript,Module,Requirejs,我想我不太理解Require.js,所以我想问一下为什么我可以像下面的例子(全局)那样更改firstName和lastName 不应该要求.js做一些避免污染全球范围的事情吗?我只是提供了创建对象的接口,而不是更改对象的内容。非常感谢 // someModule.js define([], function() { function Employee(firstName, lastName) { this.firstName = firstName; th
// 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());
});
});
//someModule.js
定义([],函数(){
职能员工(姓、名){
this.firstName=firstName;
this.lastName=lastName;
}
Employee.prototype.getName=函数(){
返回this.firstName=''=this.lastName;
}
返回{
createEmployee:函数(fName,lName){
返回新员工(fName,lName);
};
};
});
//main.js
require(['jquery','someModule'],函数($,someModule){
$(函数(){
var x=someModule.createEmployee('John','Doe');
document.write(x.getName()+'
);
x、 firstName=‘其他名字’;
x、 lastName=‘其他姓氏’;
document.write(x.getName());
});
});
输出为:无名氏
一些其他名称一些其他姓氏您在这里不使用任何全局范围-您的代码在匿名函数(闭包)中运行,并且没有任何东西绑定到窗口全局对象-因此这很好。您在这里不使用任何全局范围-您的代码在匿名函数(闭包)中运行并且没有任何东西绑定到窗口全局对象-因此这很好。您创建的对象具有属性“firstName”和“lastName”。您的代码没有阻止对这些属性的修改 在较新的JavaScript实现中,有很多方法可以做到这一点,但Requirejs不会自动做到这一点(至少在没有重大的重新设计或增强项目的情况下不会)
具体来说,该方法允许您创建只读属性。现在,这将阻止所有代码修改属性。如果您想要控制对象的属性,可以使用@c24w在另一个答案中建议的技术。您创建的对象具有属性“firstName”和“lastName”。您的代码没有阻止对这些属性的修改 在较新的JavaScript实现中,有很多方法可以做到这一点,但Requirejs不会自动做到这一点(至少在没有重大的重新设计或增强项目的情况下不会)
具体来说,该方法允许您创建只读属性。现在,这将阻止所有代码修改属性。如果您想要对象控制下的属性,可以使用@c24w在另一个答案中建议的技术。我认为您将全局泄漏与属性可见性混淆了
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();
};
我认为你把全球泄密和财产的可见度混为一谈了
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();
};
发布代码而不是图像链接更好。发布代码而不是图像链接更好。您能给我一些注意事项吗?如何保护员工的属性不被直接访问?谢谢。当使用
defineProperty
或defineProperties
时,将writable
键设置为false是一个很好的解决方案(如果向后兼容性不是问题的话)。你能给我一些注意事项吗?如何保护员工的属性不被直接访问?谢谢。使用defineProperty
或defineProperties
时,将writable
键设置为false是一个很好的解决方案(如果向后兼容性不是问题的话)。链接已更改,因为两个链接现在都已失效,我找不到镜像,因此将其删除:(帖子的缓存副本可用。链接已更改,因为两个链接现在都已失效,我找不到镜像,因此将其删除:(帖子的缓存副本可用。)。