使用 Revealing Module Pattern,为什么要更改此对象?

Using the Revealing Module Pattern, why is this object changed?

给定以下代码:

var House = function(x, y) {
    var _posX;
    var _posY;

    function init(x,y) {
        _posX = x;
        _posY = y;
    }

    // Auto init
    init(x, y);


    // Public
    return {
        posX: _posX,
        posY: _posY,

        setPosition: function(x, y) {
            _posX = x;
            _posY = y;
        }
    };
};

如果我创建一个新的 House 对象:

var house = new House(3,4);

并使用setPosition方法改变位置:

house.setPosition(100,50);

我预计房子的位置仍然是 3,4.. 但是它改变了(这实际上是我想要的,但我不明白这是怎么可能的?)我不明白,因为 Javascript 已经返回了 3,4 的位置,我希望它一直都是这样,即使我使用 set 方法更改位置。

console.log(house.posX + ',' + house.posY); // 100,50 (why not 3,4?)

额外的问题:是否有正确的方法来执行初始化而不是将它放在代码中间?

此行为是由于 closure

Closures are functions that refer to independent (free) variables (variables that are used locally, but defined in an enclosing scope). In other words, these functions 'remember' the environment in which they were created.

_posx_posy 是在周围范围内定义的,setPosition 记住了它。

顺便说一句,我认为 init 应该被删除,你应该在你的构造函数中直接分配 _posx_posy