是否可以在JS对象中进行深度自引用?
我知道可以在同一级别进行自我参考,就像这样:
var foo = {
a: 'bar',
b: 'baz',
c: () => {
return this.a + this.b;
}
};
console.log(foo.c()); // barbaz
我很好奇,是否有可能从更深层次上做到这一点...
var foo = {
a: 'bar',
b: 'baz',
c: {
ca: 'hello',
cb: () => {
return this.a + this.b;
}
}
};
console.log(foo.c.cb()); // barbaz
如果没有,怎么办?
答案 0 :(得分:1)
一种解决方案是将foo对象作为上下文来WITH CTE
AS (SELECT OH.employeeid,
OH.managerid,
OH.email AS EMPEMAIL,
1 AS level
FROM TORGANIZATION_HIERARCHY OH
WHERE OH.[email] = user1@abc.com
UNION ALL
SELECT CHIL.employeeid,
CHIL.managerid,
CHIL.email,
level + 1
FROM TORGANIZATION_HIERARCHY CHIL
JOIN CTE PARENT
ON CHIL.[managerid] = PARENT.[employeeid]),
ANOTHERCTE
AS (SELECT
T.[email],
T.[destination_account],
T.[customer_service_rep_code]
FROM [KGFGJK].[DBO].[TRANS] AS T)
SELECT *
FROM ANOTHERCTE
INNER JOIN CTE
ON CTE.empemail = ANOTHERCTE.[email];
的{{1}}方法,然后call
将引用cb
和this
和{{1} },但是您应该使用常规功能而不是箭头功能。
foo
另一种解决方案是将a
转换为getter,然后可以使用箭头函数,因为上下文将以getter的上下文为准,在这种情况下,getter的上下文是根对象。
b
答案 1 :(得分:0)
您将必须创建一个返回引用的“ self
”的函数。
您可以通过引用顶级范围将新属性应用于this
。
let foo = createFoo();
let bar = Object.assign(createFoo(), {
a : 'zam',
b : 'zip'
});
console.log(foo.c.cb()); // barbaz
console.log(bar.c.cb()); // zamzip (extended foo)
function createFoo() {
let self = {}; // Create a new scope.
return Object.assign(self, {
a: 'bar',
b: 'baz',
c: {
ca: 'hello',
cb: () => self.a + self.b
}
});
}