Javascript 要求和避免污染全球范围

Javascript 要求和避免污染全球范围,javascript,module,requirejs,Javascript,Module,Requirejs,我想我不太理解Require.js,所以我想问一下为什么我可以像下面的例子(全局)那样更改firstName和lastName 不应该要求.js做一些避免污染全球范围的事情吗?我只是提供了创建对象的接口,而不是更改对象的内容。非常感谢 // someModule.js define([], function() { function Employee(firstName, lastName) { this.firstName = firstName; th

我想我不太理解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());
    });
});
//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是一个很好的解决方案(如果向后兼容性不是问题的话)。链接已更改,因为两个链接现在都已失效,我找不到镜像,因此将其删除:(帖子的缓存副本可用。链接已更改,因为两个链接现在都已失效,我找不到镜像,因此将其删除:(帖子的缓存副本可用。)。