Javascript 它的真正含义是什么';回收利用';在这个代码片段中?

Javascript 它的真正含义是什么';回收利用';在这个代码片段中?,javascript,Javascript,在MDN上,我发现了以下代码片段,注释为“回收相同的对象”: // recycling same object function withValue(value) { var d = withValue.d || ( withValue.d = { enumerable: false, writable: false, configurable: false, value: null } ); d.value = val

在MDN上,我发现了以下代码片段,注释为“回收相同的对象”:

// recycling same object
function withValue(value) {
  var d = withValue.d || (
    withValue.d = {
      enumerable: false,
      writable: false,
      configurable: false,
      value: null
    }
  );
  d.value = value;
  return d;
}
有人能用简单的语言解释一下这段代码的真正功能吗?这对于初学者来说并不明显。谢谢

和源url:

另外,与其将
d
放在
withValue
函数本身上,不如将其放在
withValue
的原型上,比如:

var d = withValue.prototype.d || ( ...

这里的主要考虑事项是什么?

它是一个辅助函数,用于定义属性描述符对象,该对象用作
对象的第三个参数。defineProperty()
工具

在第一次运行时,它为
withValue
函数指定一个默认私有属性,该函数强制
Object.defineProperty()
添加一个不可枚举、不可写、不可配置且值传递给
withValue
函数的不可变属性

所以下面的代码

var obj = {};
Object.defineProperty(obj, "newProp", withValue(10));
console.log(obj); // <- Object {newProp: 10}
var obj={};
Object.defineProperty(obj,“newProp”,带值(10));

console.log(obj);// 第一次调用函数时,它将创建一个新变量“d”,并将其分配给自身。在OOP中,带有value的函数
类似于类,
d
类似于静态成员

console.log(withValue.d);    //undefined
var x = withValue(5);
console.log(x.value);    //5
console.log(withValue.d.value);    //5
console.log(x === withValue.d);    //true
变量
x
和变量
withValue.d
都是对同一对象的引用:

withValue.d.value = 1;
console.log(x.value);    //1
如果我再次调用
withValue
,它将回收或重用现有静态成员(withValue.d)并更新其值:

var y = withValue(8);   
console.log(withValue.d.value, y.value, x.value);    //8 8 8
console.log(x === y,  x === withValue.d, y === withValue.d);    //true true true
更新:如果带有值的
为:

function withValue(value) {
  var d = {
    enumerable: false,
    writable: false,
    configurable: false,
    value: null
  };
  withValue.d = d;
  d.value = value;
  return d;
};
然后每次调用函数都会创建一个新对象:

var x = withValue(1);
var y = withValue(2);
console.log(withValue.d.value, y.value, x.value);    //2 2 1
console.log(x === y,  x === withValue.d, y === withValue.d);    //false false true

y.value = 999;
console.log(withValue.d.value, y.value, x.value);    //999 999 1

因此,现在创建了两个对象—一个由
y
withValue.d
引用,另一个由
x
引用。在第一种情况下,这三个变量访问同一个对象。

我认为它所做的只是使用
函数
对象(
withValue
)来操作对象,而不是像
vard={}
这样的操作。不过,我不太明白这是如何与
Object.defineProperty()
相适应的。我认为该函数用于生成一些要传递给Object.defineProperty的属性。如果在
withValue
函数中指定
d
属性,则返回的值将基于该赋值。它使用的是正常英语意义上的“循环”。它重复使用上一次调用使用的相同对象,而不是每次都创建一个新对象。还有一个附带问题,与其将
d
分配给
withValue.d
,不如将其放入函数的原型中,
withValue.prototype.d
?这里考虑的是什么?Hi indGov,我正试图遵循您的推理,但仍在与最后一节进行斗争:如果函数
withValue
只在每次迭代中更新其值,那么它会循环使用什么?从您的示例中,将
1
更新为
8
,我没有看到任何东西被回收。我是否遗漏了一些重要的要点?Thx。检查更新。。。我已经修改了函数,这样它就不会回收对象了。谢谢你的更新。您能想象它在Object.defineproperty()的上下文中有多有用吗,如MDN的网页所示?这里的“回收”有什么意义?在这个例子中似乎没有任何关联。他们基本上是重复使用同一个对象来为不同的对象提供配置。谢谢,顺便问一下,你能看看我编辑的问题吗?