1

我想我不太了解 Require.js,所以我想问一下为什么我可以像下面的示例(全局)那样更改 firstName 和 lastName。

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());
    });
});

输出是:
John Doe
Some other name Some other surname

4

3 回答 3

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();
};
于 2013-03-21T17:54:18.677 回答
1

您在这里没有污染任何全局范围-您的代码在匿名函数(闭包)内运行,并且没有任何内容绑定到窗口全局对象-所以很好。

于 2013-03-21T17:48:51.990 回答
1

您创建的对象具有属性“firstName”和“lastName”。您的代码没有采取任何措施来阻止对这些属性的修改。

在较新的 JavaScript 实现中,有一些方法可以做到这一点,但 Requirejs 不会自动做到这一点(至少在没有重大重新设计或增强项目的情况下不会)。

具体来说,该defineProperty方法允许您创建只读属性。现在,这将阻止所有代码修改属性。如果您想要受对象控制的属性,您可以使用@c24w 在另一个答案中建议的技术。

于 2013-03-21T17:50:17.470 回答