在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;
}
有人可以使用简单的语言解释一下这段代码到底是做什么的吗?这对初学者来说并不那么明显。感谢。
源网址:enter link description here
此外,不要将d
放在withValue
函数本身上,为什么不把它放在withValue
的原型上,如:
var d = withValue.prototype.d || ( ...
这里的主要考虑因素是什么?
答案 0 :(得分:1)
第一次调用该函数时,它会创建一个新变量' d'并将其分配给自己。在OOP中,函数withValue
将是类似的类,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
更新:如果withValue
是:
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
现在创建了2个对象 - 一个由y
和withValue.d
引用,另一个由x
引用。在第一种情况下,这三个变量正在访问同一个对象。
答案 1 :(得分:0)
它是一个辅助函数,用于定义用作db.fxh.update({
id: 456,
'pf.acc': {
$elemMatch: {
accid: 1494235749,
cyc: {
$elemMatch: {
cycid: 1494404053
}
}
}
}
},
{
$push: {
'pf.acc.$.cyc': {
'detail': {
dcycid: 123461,
status: "test"
}
}
}
}
)
工具的第三个参数的属性描述符对象。
在第一次运行时,它会为Object.defineProperty()
函数分配一个默认私有属性,强制withValue
添加一个不可枚举的不可变属性,不可写,不可配置且值为{传递给Object.defineProperty()
函数。
以下代码;
withValue
将为var obj = {};
Object.defineProperty(obj, "newProp", withValue(10));
console.log(obj); // <- Object {newProp: 10}
分配一个名为obj
的属性,该属性不可枚举,不可写且不可配置且值为10.