首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  程序员

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

  •  
  •   murmur · 258 天前 · 1755 次点击
    这是一个创建于 258 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    20 回复  |  直到 2019-03-28 10:11:38 +08:00
        1
    owenliang   258 天前
    的确,语法问题
        2
    roscoecheung1993   258 天前
    所以原帖是啥....
        3
    murmur   258 天前
        4
    enenaaa   258 天前
    我个人挺讨厌这种覆盖标准库的写法的。 增加其他人的理解工作量。
        5
    molvqingtai   258 天前 via Android
    这不是面试刷不刷题的问,关键是简历写了 9 年工作经验,写了 9 年代码却没有研究过这些框架的实现原理,说明你这个人就没有学习的心态和自我提升的意识,这又是不是什么好深奥的算法,像 defineProperty 这种双绑原理网上分析文章一大堆,你都没有瞥过一眼,说明你对你的工作和技术缺乏最基本的热情,只想当一条咸鱼混日子。

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

    当然前端变得比变脸还快, 晚点就会一大堆 proxy 了的吧..
        15
    TomVista   258 天前
    @murmur 我的水平也就止步于此了,至于 vue 到底怎么实现的双向绑定,还是弄不明白,要让我自己写一个双向绑定,我肯定能写出来,但是要是先给我一个对象,让我把这个对象的内容双向绑定,不改对象,我是一点思路都没有.....
        16
    DOLLOR   258 天前
    我调试的时候,曾经利用 defineProperty,找到属性被莫名覆盖的问题。这点我比较推崇。其他作用,可能因为框架已经帮忙封装,而不能直接感受到好处了
        17
    wuweijia   258 天前
    面试造火箭,入职写页面
        18
    ericgui   258 天前
    @wuweijia 就是,这招人的公司,考人家的是 vue 原理,但估计也就是写页面而已
        19
    zhzbql   257 天前
    浏览器里一堆原生对象的 getter,setter 属性不用 definePerty 怎么改?
        20
    murmur   257 天前
    @zhzbql 乱下钩子总归不好的,这个是个甜蜜的毒药
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   983 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 20:24 · PVG 04:24 · LAX 12:24 · JFK 15:24
    ♥ Do have faith in what you're doing.