首先,原帖来看,如果看了楼主的发帖,能大概看出这前端也就是个称职的页面工程师,所以那个面试者靠多次面试建立题库完全可行,毕竟别人就是拧螺丝写页面的,不了解底层原理把页面做出来 OK 啊。
那么我们来看一下这个被吹的 defineProperty,在一般开发者手里能干吗
1、网上最多的,当然就是 vue 的例子,但是绝大多数的例子也就是 vue,如果 vue 能让你不需要了解 defineProperty 就把框架用的舒舒服服明明白白的,当然是 vue 牛逼!!!
2、魔改一个 object,因为你可以定义这东西可不可以被枚举,是不是只读的,但是作为一个极其灵活的语言来说,一个东西该怎么用是靠团队规范和代码检查的,不需要用或者改的时候我碰都不会碰,当我需要改你东西的时候我有一万种方法让你的 defineProperty 失效,所以这个是可以规避的,类似的,如果我的数据和方法分开,我不会担心 Array 里有不想被枚举出来的东西,我不会魔改基础函数,我的扩展函数都在 utils 里,我不认为用 ArrayUtils 的就比直接在 Array.prototype 上挂东西的人低一等(以前 IE 里有一个坑就是再 Array.prototype 上不通过 defineProperty 挂函数,这个函数会被枚举出来,但是我不挂不就好了么。。。)
3、框架里挂 getter 提示方法即将被废弃,这也是我搜索后才学到的用法,当然别人是框架,而且在 API 更迭时才会用到,何况对于程序员 warning 不等于没有么,只有真的我发现你把这 API 删了我才会发现(例子和出处参考 https://cloud.tencent.com/developer/article/1009647 )
4、调试,当我发现某个变量被改了,我不知道谁改的,可以用 defineProperty 下钩子,不过不会这个东西问题不大,如果我的调试足够牛逼,或者我的运气足够好,我不下钩子就能快速定位到问题所在,或者我的属性赋值用的是 java 那种 setXXX,getXXX 的写法,这个东西也是可以规避的
5、简化写法,这也是腾讯文中的例子,但是我认为这个方法是个反例,通过 defineProperty 将 style 里的属性挪到外层来(比如 dom.transform=xxx,而不是 dom.style.tranform=xxx ),会给没读过相关代码的人一个误解,反倒是定义一个 setTranform/setTranslate 这样的函数更安全,毕竟后面一看就是个自己定义的工具函数,前面的是个什么东西?新特性?写错了?
所以看来,框架帮我们屏蔽掉了很多细节,npm 上的各种 utils 让我们避开了这个方法,就算不知道似乎也不丢人,当然知道是加分项,人家只是想做做页面而已,又不是开发个新框架
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.