gpt4 book ai didi

javascript - 不评估访问器检测 Object.defineProperty 是否具有链式数据描述符

转载 作者:行者123 更新时间:2023-11-28 17:32:29 28 4
gpt4 key购买 nike

在下面的示例代码中,我想检测属性(“cv”)是否进一步链接到其他描述符。当处理数据描述符时,这会陷入一个兔子洞,并且没有尽头,因为 JS 不断返回数据描述符。如果链深处存在访问器,我们可以通过测试是否定义了访问器函数来检测它。

目标是使用值属性的描述符复制描述符的值属性,将其保存在某处并使用访问器描述符稍后访问保存的值。但是,这需要在不无意中实际调用任何深层访问器的情况下完成(这最终会返回一个最终会过时的计算值)。以下内容将不起作用

var newDescriptor = {
value : oldDescriptor.value
}

以下内容

var newDescriptor = {}
Object.defineProperty(newDescriptor, value, Object.getOwnPropertyDescriptor(oldDescriptor, 'value'));

可能可以工作,但在一次又一次调用时最终会堆积不必要的描述符链,这最终可能会耗尽内存。但此解决方案还需要检测是否已经为描述符设置了这样的链,并可能通过拾取叶级数据描述符来减少它们。这给我们带来了数据描述符兔子洞!

真正的用例是将现有数据描述符转换为访问器描述符,而表观数据描述符可能并非如此并且已经链接了深层访问器。我可能缺少其他更好的方法来解决这个问题。

代码示例

var ob = {cv : 5};
console.log(" ob.cv : " + ob.cv ); // Returns 5
var cvd1 = Object.getOwnPropertyDescriptor(ob, 'cv');
console.dir( cvd1 );
var cvd2 = Object.getOwnPropertyDescriptor(cvd1, 'value');
console.dir( cvd2 );
var cvd3 = Object.getOwnPropertyDescriptor(cvd2, 'value');
console.dir( cvd3 );

// Deepest chained accessor descriptor
var deepAccessorDescriptor = {};
Object.defineProperty(deepAccessorDescriptor, 'value', {
get : function() { return 74 ; }
} );

// Chained data descriptor
var chainedDataDescriptor = {};
Object.defineProperty(chainedDataDescriptor, 'value', deepAccessorDescriptor );
Object.defineProperty(ob, 'cv', chainedDataDescriptor);
console.log(" ob.cv : " + ob.cv ); // Returns 74 from deepAccessorDescriptor

最佳答案

描述符不能被链接。就这么简单。

当您调用Object.defineProperty时,它不会存储您传递的描述符对象 - 它只是查看它并将相关内容存储在属性的属性中。

当您调用Object.getOwnPropertyDescriptor时,它不会访问以前存储的对象。它检查属性的属性,并使用纯数据属性创建一个新对象来描述属性。

var deepDescriptor = {};
Object.defineProperty(deepDescriptor, 'value', {
get() {
console.log("evaluated");
return 74;
}
});
console.log("descriptor created");
var ob = {};
Object.defineProperty(ob, 'cv', deepDescriptor);
console.log("property defined");
console.log("ob.cv", ob.cv);

您可以看到 deepDescriptor.value getter 是在 Object.defineProperty(…, deepDescriptor) 调用期间而不是在 ob.cv 访问。

关于javascript - 不评估访问器检测 Object.defineProperty 是否具有链式数据描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49988007/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com