使用带有Getter / Setter的构造函数初始化JavaScript / ES5对象

时间:2018-07-06 03:02:04

标签: javascript constructor ecmascript-5 object-initialization

以下构造函数是用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的当前值。我说对了还是遗漏了什么?

对此事有解释吗?

2 个答案:

答案 0 :(得分: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”的值。

希望您的疑问现在已经清楚

答案 1 :(得分:0)

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

然后这些私有字段通过具有getter / setter的属性暴露给外界。

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

另一方面,

JavaScript不能将其对象的状态设为私有。

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