关于 ES 的那个 defineProperty,写一点自己的看法

2019-03-27 11:28:19 +08:00
 murmur

首先,原帖来看,如果看了楼主的发帖,能大概看出这前端也就是个称职的页面工程师,所以那个面试者靠多次面试建立题库完全可行,毕竟别人就是拧螺丝写页面的,不了解底层原理把页面做出来 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 让我们避开了这个方法,就算不知道似乎也不丢人,当然知道是加分项,人家只是想做做页面而已,又不是开发个新框架

2643 次点击
所在节点    程序员
20 条回复
owenliang
2019-03-27 11:41:17 +08:00
的确,语法问题
roscoecheung1993
2019-03-27 11:41:24 +08:00
所以原帖是啥....
murmur
2019-03-27 11:45:14 +08:00
enenaaa
2019-03-27 11:59:15 +08:00
我个人挺讨厌这种覆盖标准库的写法的。 增加其他人的理解工作量。
molvqingtai
2019-03-27 12:50:16 +08:00
这不是面试刷不刷题的问,关键是简历写了 9 年工作经验,写了 9 年代码却没有研究过这些框架的实现原理,说明你这个人就没有学习的心态和自我提升的意识,这又是不是什么好深奥的算法,像 defineProperty 这种双绑原理网上分析文章一大堆,你都没有瞥过一眼,说明你对你的工作和技术缺乏最基本的热情,只想当一条咸鱼混日子。

工作够用就行了吗?当然,对于像我这刚入行一两年的程序员确实技能够用行了,不知道一些框架原理,好像也没什么不对,但是我认为作为一个工作了 9 年的程序员,一个从量变到质变的过程,如果连一些最基本的原理都没有了解过的话,我认为这很不对!
ax521
2019-03-27 12:51:12 +08:00
我怎么回复不了
murmur
2019-03-27 12:51:47 +08:00
@molvqingtai 准确点说 vue 就近两三年才开始火的,如果是个传统公司开发,前面用 flash、extjs、jquery 也不奇怪,甚至他可能会 java 但是没太准备都没写上去
Justin13
2019-03-27 12:52:40 +08:00
一般只在调试的时候用用。还有 freeze 类似
ben1024
2019-03-27 12:53:45 +08:00
ECMAScript ? 认为是 elasticsearch ? 我可能进错了
jinue9900
2019-03-27 13:51:09 +08:00
@ben1024 23333 进来之前跟你一样
shyrock
2019-03-27 13:56:28 +08:00
如果面试就一个人,我就问工作中实际的问题;如果有多个人而且都能解决实际问题,还非要我选一个招进来,我就会问这些屠龙之技了。
TomVista
2019-03-27 15:58:32 +08:00
双向绑定不是用的 getter setter 吗?
murmur
2019-03-27 16:01:58 +08:00
@TomVista 用的函数是这个
SakuraKuma
2019-03-27 16:06:15 +08:00
同意#5 的缺乏基本热情.
但我觉得没啥不妥, 9 年的想咸鱼, 公司的想保持技术栈新.
双向选择而已.
可能老旧技术的公司活得比新技术的小公司还长呢.

当然前端变得比变脸还快, 晚点就会一大堆 proxy 了的吧..
TomVista
2019-03-27 16:06:22 +08:00
@murmur 我的水平也就止步于此了,至于 vue 到底怎么实现的双向绑定,还是弄不明白,要让我自己写一个双向绑定,我肯定能写出来,但是要是先给我一个对象,让我把这个对象的内容双向绑定,不改对象,我是一点思路都没有.....
DOLLOR
2019-03-27 16:41:52 +08:00
我调试的时候,曾经利用 defineProperty,找到属性被莫名覆盖的问题。这点我比较推崇。其他作用,可能因为框架已经帮忙封装,而不能直接感受到好处了
wuweijia
2019-03-27 17:53:04 +08:00
面试造火箭,入职写页面
ericgui
2019-03-28 00:38:13 +08:00
@wuweijia 就是,这招人的公司,考人家的是 vue 原理,但估计也就是写页面而已
zhzbql
2019-03-28 10:07:17 +08:00
浏览器里一堆原生对象的 getter,setter 属性不用 definePerty 怎么改?
murmur
2019-03-28 10:11:38 +08:00
@zhzbql 乱下钩子总归不好的,这个是个甜蜜的毒药

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/549037

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX