【发布时间】:2018-07-06 03:02:04
【问题描述】:
下面的构造函数是用 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 的当前值交给我。我做对了吗,还是遗漏了什么?
对此事有何解释?
【问题讨论】:
-
属性描述符的属性之一是
value; developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…。而且我觉得你使用这些 getter 和 setter 让你自己太难了,因为它们似乎并没有真正做任何特别的事情。 -
是的,这都是对参数的闭包。您可以通过例如轻松地测试它。关闭另一个函数中的参数,使其可在外部访问(例如,通过将其设置为全局变量以进行测试),并使用该函数更改属性:
let changer; function Range(from, to) { changer = x => { from = x }; /* rest of constructor as you wrote it */ }; var range = new Range(4, 13); changer(999); console.log(range.fromProp); -
@HereticMonkey,它们似乎为您的对象的内部状态提供了很好的封装:)
-
@MarkMeyer,我没有说代码不起作用。如果您理解我的意思,我的问题是基于“了解它的工作方式”。
fromValue拥有 22,但问题是,它永远不会从range对象的fromProp属性中获取该值,而是从构造函数的from参数变量中获取该值:) -
fromProp不是数据属性,而是accessor property。 property accessor operator(在本例中为range.fromProp中的.,不要与访问器属性混淆)调用访问器属性的 getter 函数,该函数将值从作用域访问解析为构造函数中的from参数.
标签: javascript constructor ecmascript-5 object-initialization