Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
克服对象解构默认行为的JavaScript方法_Javascript_Destructuring - Fatal编程技术网

克服对象解构默认行为的JavaScript方法

克服对象解构默认行为的JavaScript方法,javascript,destructuring,Javascript,Destructuring,在JS中,有没有一种方法可以克服对象在非结构化时的默认行为 // Normally destructing lifts properties from an object const foo = { a: 1, b: 2, }; const { a, b } = foo; // a = 1, b = 2 // I would like to have a method return the properties to be // destructured const bar = {

在JS中,有没有一种方法可以克服对象在非结构化时的默认行为

// Normally destructing lifts properties from an object
const foo = {
  a: 1,
  b: 2,
};

const { a, b } = foo; // a = 1, b = 2

// I would like to have a method return the properties to be
// destructured
const bar = {
  toObject: () => {
    return { a, b };
  },
};

const { a, b } = bar; // a = undefiner, b = undefined
我知道我可以简单地使用
const{a,b}=bar.toObject()
我能想到的最接近我想要的东西就是神奇的方法。

不。规范位于右侧,可解析为可通过转换为对象的值,如果传递了对象,则只返回对象本身(即,不调用对象上的特殊方法将其转换为其他对象)


如果要使用数组分解,则可以:

 const [a, b] = {
   *[Symbol.iterator]() {
     yield "some"; yield "stuff";
   }
};

您可以通过使用代理来修饰目标,拦截
ownKeys
get
以伪造对象进行分解,从而使
toObject
按预期工作:

let withToObject=obj=>新代理(obj{
所有者密钥(o){
返回Object.keys(o.toObject())
},
获得(o,道具){
返回o.toObject()[prop]
}
});
设bar=withToObject({
aa:11,
bb:22,
抄送:33,
toObject(){
返回{
a:这个,
b:这个
};
}
});
常数{a,b}=bar;

console.log(a,b)
函数中
a
b
的值来自哪里?“但这需要对象的使用者知道其内部如何工作”分解已经需要知道内部如何工作。但只有在知道有什么属性的情况下,才能知道要分解什么。所以我要反驳你的说法,你现在要求对象知道它将如何被分解,这比需要知道一个对象有键
a
b
更麻烦。你的实际用例是什么?我的用例是我正在编写一个现有的类来使用私有变量。现在我使用的是
Object.freeze
方法,因为它允许去结构化(在我的应用程序中广泛使用),但我更愿意使用构造函数本地方法(因为我认为不应该公开属性)。我将是第一个承认差别很小的人。这个问题更多的是出于我的好奇心(因为我在文档中找不到任何东西)。我认为OP的意思是
toObject
类似于
toString
——在执行
“some string”+some object
@VLAZ:当然。我的意思是,对值进行的唯一“转换”是调用
ToObject
(内部算法),它只是“按原样”返回对象值。它不检查对象是否有特定的方法并调用它。实际上,我正在寻找一种方法来克服JS不支持的
ToObject
。真遗憾,我想这会有很多副作用。。。尽管如此,它还是有效的,好主意:)按照我的说法,这是有效的,但是它确实在去结构化之前(例如
bar.a==11
)暴露了属性
a
b
。@最后一个影子:是的,它确实。。。解构只是一种语法糖,
{a}=x
a=x.a