JS 拓展对象原型方法的正确姿势

一、为什么要拓展原型对象方法

    我们在平时的项目工作中,虽然很多的时候很多方法都有我们的第三方库件或者定义类已经完全可以满足我们的方法需求,但是有的时候由于需求或者场景的需要,不得不自己手动封装一下对象原型拓展,即便如此,小编还是不太建议修改原生对象,因为如果封装不慎,就有可能会导致后续的维护问题

二、不正确的封装姿势

        2.1  Array.encapsulation

        

        错误的封装方法,如果当前编译器支持语法检测,如此封装将会产生一下错误信息:

        

        提示信息: 类型错误  _array.encapsulation is not a function  告诉我们encapsulation 不是一个方法。

        所以这种方法是不正确的封装拓展方法

        2.2   Array.prototype.encapsulation 

      这种方法可以成功的进行方法封装,但是会有一个小问题,请看以下代码:

        

        

        ok! 看起来此种封装方法很是完美,顺利输出了我们关心的值:   拓展原型对象方法

        但是但是 so...   请看下面的一个小实例:

        

        到底会有什么样的输出呢?


        很明显可以看出这种方法是有弊端的不利于维护。并且我们以后再使用for in的时候,还必须过滤掉这个方法(encapsulation)。常用的过滤方法可见:

        

三、正确的封装姿势

        巧用Object对象中提供的方法 defineProperty(),defineProperty接收三个参数并且都为必填信息

        第一个参数:目标对象
        第二个参数:需要定义的属性或方法的名字

        第三个参数:目标属性所拥有的特性

        前面两个参数较为简单我们完全可以略过,主要说一下第三个参数。

        value:属性的值(不用多说了)
        writable:如果为false,属性的值就不能被重写,只能为只读了
        configurable:总开关,一旦为false,就不能再设置他的(value,writable,configurable)

        enumerable:是否能在for...in循环中遍历出来或在Object.keys中列举出来。

        详细参数用法,读者可自行查询资料进行阅读,我们接着上代码:

        

        

四 总结

JavaScript允许拓展对象的原型属性,善于利用此特性可以设计出更加贴合实际需求的类。比如,我们可以设计一个Fruit类,当Fruit的价格被初始化之后,不允许再进行修改(除了较为特殊的业务场景和设计下)。


        



        

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值