深度自引用对象的属性

时间:2019-12-19 14:49:29

标签: javascript object

是否可以在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

如果没有,怎么办?

2 个答案:

答案 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将引用cbthis和{{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
    }
  });
}