yuhongda / key-accessor

access a key of object safely
https://www.npmjs.com/package/key-accessor
0 stars 0 forks source link

不明白readme中的示例中,访问属性时为什么要用函数调用的方式 #1

Open joe-sky opened 6 years ago

joe-sky commented 6 years ago

如下代码中:

...
const music = {
  rock: {
    band: 'G N\' R'
  },
  pop: {

  }
}

...
obj.rock.band() // output: G N' R

不太明白这里取band属性时为什么要用函数调用的方式?这样如果band是个函数变量,是不是就无法正常执行了。

yuhongda commented 6 years ago

因为get被用作返回一个新的proxy对象(避免undefined),所以只能用apply来处理返回值,如果是函数可以写两个括号。 :P

joe-sky commented 6 years ago

嗯了解了。不过我觉得如果能够实现正常用属性的方式访问变量,这样这个库使用起来会更容易,现有代码的迁移成本也会更少,还是比较期待能够实现。

不知道实现难度是多大,我脑洞一下理想情况能不能这样实现:

  1. obj.rock的时候返回的这个proxy对象,使它的取值方式保持和music.rock一致
  2. 当去取这个proxy对象上的属性时,即obj.rock.band,再去判断rock的值是否为null

其实nj模板在取对象属性时也实现了这种安全访问的机制,大概思路和上面写的差不多。不过nj是字符串语法糖,它的实现原理可以不受原生语法限制而更加自由;用js原生支持的方式实现也可能会更有难度。

yuhongda commented 6 years ago

确实有迁移成本的问题,也确实由于proxy的限制导致了现在的实现方式。要想达到和原生对象访问同样的语法,估计还是要靠语言本身来支持。 ps:实际上tc39中已经有了类似特性(Optional Chaining),目前处在stage1阶段,可以通过babel来使用。但还是要在语句上加个问号......

yuhongda commented 6 years ago

https://github.com/tc39/proposal-optional-chaining/blob/master/README.md