以下构造函数是用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
之后,将使用我通过的值初始化fromProp
和toProp
构造函数的参数。但是我很难理解这里到底发生了什么。
或者,是否这里的整个“初始化/访问属性”都是在setter / getter调用的闭包中捕获的?但是,如果是这样,那么在任何时候我使用-
range.fromProp = 22;
实际上,永远不会将值22设置为range
对象的属性fromProp
,而是将其设置为参数变量from
,然后每当我请求-
var fromValue = range.fromProp;
它只是交给我参数变量from
的当前值。我说对了还是遗漏了什么?
对此事有解释吗?
答案 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>