首先,原帖来看,如果看了楼主的发帖,能大概看出这前端也就是个称职的页面工程师,所以那个面试者靠多次面试建立题库完全可行,毕竟别人就是拧螺丝写页面的,不了解底层原理把页面做出来 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 让我们避开了这个方法,就算不知道似乎也不丢人,当然知道是加分项,人家只是想做做页面而已,又不是开发个新框架
1
owenliang 2019-03-27 11:41:17 +08:00
的确,语法问题
|
2
roscoecheung1993 2019-03-27 11:41:24 +08:00
所以原帖是啥....
|
3
murmur OP |
4
enenaaa 2019-03-27 11:59:15 +08:00
我个人挺讨厌这种覆盖标准库的写法的。 增加其他人的理解工作量。
|
5
molvqingtai 2019-03-27 12:50:16 +08:00 via Android
这不是面试刷不刷题的问,关键是简历写了 9 年工作经验,写了 9 年代码却没有研究过这些框架的实现原理,说明你这个人就没有学习的心态和自我提升的意识,这又是不是什么好深奥的算法,像 defineProperty 这种双绑原理网上分析文章一大堆,你都没有瞥过一眼,说明你对你的工作和技术缺乏最基本的热情,只想当一条咸鱼混日子。
工作够用就行了吗?当然,对于像我这刚入行一两年的程序员确实技能够用行了,不知道一些框架原理,好像也没什么不对,但是我认为作为一个工作了 9 年的程序员,一个从量变到质变的过程,如果连一些最基本的原理都没有了解过的话,我认为这很不对! |
6
ax521 2019-03-27 12:51:12 +08:00 via Android
我怎么回复不了
|
7
murmur OP @molvqingtai 准确点说 vue 就近两三年才开始火的,如果是个传统公司开发,前面用 flash、extjs、jquery 也不奇怪,甚至他可能会 java 但是没太准备都没写上去
|
8
Justin13 2019-03-27 12:52:40 +08:00 via Android
一般只在调试的时候用用。还有 freeze 类似
|
9
ben1024 2019-03-27 12:53:45 +08:00
ECMAScript ? 认为是 elasticsearch ? 我可能进错了
|
11
shyrock 2019-03-27 13:56:28 +08:00
如果面试就一个人,我就问工作中实际的问题;如果有多个人而且都能解决实际问题,还非要我选一个招进来,我就会问这些屠龙之技了。
|
12
TomVista 2019-03-27 15:58:32 +08:00
双向绑定不是用的 getter setter 吗?
|
14
SakuraKuma 2019-03-27 16:06:15 +08:00
同意#5 的缺乏基本热情.
但我觉得没啥不妥, 9 年的想咸鱼, 公司的想保持技术栈新. 双向选择而已. 可能老旧技术的公司活得比新技术的小公司还长呢. 当然前端变得比变脸还快, 晚点就会一大堆 proxy 了的吧.. |
15
TomVista 2019-03-27 16:06:22 +08:00
@murmur 我的水平也就止步于此了,至于 vue 到底怎么实现的双向绑定,还是弄不明白,要让我自己写一个双向绑定,我肯定能写出来,但是要是先给我一个对象,让我把这个对象的内容双向绑定,不改对象,我是一点思路都没有.....
|
16
DOLLOR 2019-03-27 16:41:52 +08:00
我调试的时候,曾经利用 defineProperty,找到属性被莫名覆盖的问题。这点我比较推崇。其他作用,可能因为框架已经帮忙封装,而不能直接感受到好处了
|
17
wuweijia 2019-03-27 17:53:04 +08:00
面试造火箭,入职写页面
|
19
zhzbql 2019-03-28 10:07:17 +08:00
浏览器里一堆原生对象的 getter,setter 属性不用 definePerty 怎么改?
|