0

以下构造函数是用 JavaScript / ES5 编写的 -

function Range(from, to) {

    function getFrom() { return from; }
    function getTo() { return to; }

    function setFrom(f) { from = f; }
    function setTo(t) { to = t; }

    Object.defineProperties(this, {
        fromProp: { get: getFrom, set: setFrom, enumerable: true, configurable: false },
        toProp: { get: getTo, set: setTo, enumerable: true, configurable: false }
    });
};

我使用此构造函数创建一个对象,如下所示 -

var range = new Range(4, 13);  

我对对象创建的一般理解是,构造函数内部应该有一些代码,在实例化对象之后,将使用我通过参数传递给构造函数的值进行初始化range。但我很难理解这到底是怎么发生的。fromProptoProp

或者,这里的整个“初始化/访问属性”是在 setter/getter 调用的闭包中捕获的吗?但如果是这样,那么在我使用的任何时候——

range.fromProp = 22;

值 22 实际上永远不会设置为range对象的属性fromProp,而是设置为参数变量from,然后每当我要求时 -

var fromValue = range.fromProp;

它只是把参数变量的当前值交给我from。我做对了吗,还是遗漏了什么?

对此事有何解释?

4

2 回答 2

0
function Range(from, to) {

function getFrom() { return from; }
function getTo() { return to; }

function setFrom(f) { from = f; }
function setTo(t) { to = t; }

Object.defineProperties(this, {
    fromProp: { get: getFrom, set: setFrom, enumerable: true, configurable: false },
    toProp: { get: getTo, set: setTo, enumerable: true, configurable: false }
});

};

让我们在这里分析一下,您将“fromProp”的“get”属性设置为“getFrom”函数的引用,其中返回“from”参数的值,并且以同样的方式“set”引用函数“setFrom " 正在将值分配给 "from" 的地方。

作为结论,fromProp 的 get 和 set 不是直接持有值,而是持有访问器函数以返回“from”的值。

希望你的疑问现在清楚了。

于 2018-07-06T05:51:46.043 回答
0

如果您来自 Java/C# 世界,那么乍一看这当然有点奇怪,因为在这些语言中,通过构造函数参数传递的任何值通常用于初始化对象,即将值保存为对象的内部状态,通常用私有字段表示。然后这些私有字段通过带有 getter/setter 的属性暴露给外界。

因此,这些语言中的 getter/setter 实际上封装了对象的内部数据,而不是构造函数参数。

另一方面,JavaScript 不提供将其对象的状态设为私有的能力。

这就是为什么这里的构造函数参数的值没有保存到任何数据属性中,而是在Closure调用访问器属性时被捕获(如注释中所述),以模拟对象的私有状态。

于 2018-07-06T12:27:23.000 回答