Javascript writable特性介绍


Posted in Javascript onFebruary 27, 2015

说起js中的那些特性标记,总觉得有些怪怪的,那为什么要说到这个attribute,起源于对一个问题的疑问,我们都知道window对象其实就是

浏览器窗口的一个实例,既然是一个实例,那这个实例就应该有“属性”和“方法“,比如下面这样:

Javascript writable特性介绍

我们平时都在使用function的时候,都会定义一些属性,比如name,age等等,并且还可以对他们进行delete,set和update操作。

Javascript writable特性介绍

那么下面问题来了,既然我的person对象的name都可以动态修改,按照这个道理的话,我也应该可以修改window下的undefined值,然后就非常感兴趣的想看一看。

Javascript writable特性介绍

结果还是可想而知,我并没有成功修改undefined的值,那为什么会这样呢?没有道理呀,它又不是上一篇所说的包装类型,但我们不得不尊重结果,这就说明js底层肯定是做了些什么才会导致这样的结果,其实在底层js默认用了Writable=false标记才让undefined属性不可写入,下面具体看看。

 

一:[Writable]特性

说到属性是否可写,也许你会联想到C#中的get/set访问器,又或者是readonly关键字,下面你肯定会感兴趣我应该怎么做到属性的只读操作。在js中你只要使用defineProperty方法就可以了。

Javascript writable特性介绍

 从上面的例子中可以看到三点好玩的东西:

<1>:  我使用了defineProperty方法将person.name变成了只读字段,那有人要说了,这明明是方法,怎么会是特性,特性在我的思维里面就是

         【xxx】模式,所以这就是js的不同之处,毕竟js没有语法糖,所以定义特性只能是通过底层公开的方法来定义,也就是defineProperty。

 

<2>:  我在方法中不仅看到了writable,还有一个configurable,那这个是干什么的?其实这个就是基础配置,告诉js引擎是否可以delete,update属性,当我把configurable设为false的时候,你就不可以delete p.Name了,因为这会是一个无效操作。  

    Javascript writable特性介绍

看完了这些我觉的你应该明白了,为什么undifined不能delete和update了。都是标记做的怪,是不是觉得很有意思?

<3>: 下一个值得思考的问题就是js引擎到底是怎么做到的,在C#里面也是有Atrribute,并且这个Atrribute被编译器编译后会记录到元数据中,然后你就可以放心大胆的使用反射来获取你的Atrribute中的任何值,比如说Serializable序列化类,它就是告诉SerializableFormat怎么去反射读取类,哪些字段可以序列化,哪些不可以,不可以的你需要用NonSerialized标记。

 [Serializable]

     public class Test

     {

         [NonSerialized]

         public string Name;

    }

Javascript writable特性介绍

从图中可以看到IL中已经记录了Name为notserialized特性了,我们知道js中并没有反射,所以突破口自然就在defineProperty方法里面,但是比较遗憾,我们看不到这个方法底层的源码到底是怎么样的,所以就不知道它对Name这个字段到底做了什么才可以动态的导致它不可写,只能根据理解去猜测js引擎可能会发生的行为。

Javascript 相关文章推荐
jQuery的attr与prop使用介绍
Oct 10 Javascript
js实现透明度渐变效果的方法
Apr 10 Javascript
javascript常用正则表达式汇总
Jul 31 Javascript
全面解析JavaScript中“&amp;&amp;”和“||”操作符(总结篇)
Jul 18 Javascript
模拟javascript中的sort排序(简单实例)
Aug 17 Javascript
JS弹性运动实现方法分析
Dec 15 Javascript
浅谈JS如何实现真正的对象常量
Jun 25 Javascript
vue实现自定义多选与单选的答题功能
Jul 05 Javascript
Vue-CLI 项目在pycharm中配置方法
Aug 30 Javascript
在layer弹层layer.prompt中,修改placeholder的实现方法
Sep 27 Javascript
详解javascript void(0)
Jul 13 Javascript
多个Vue项目部署到服务器的步骤记录
Oct 22 Javascript
jQuery实现DIV层收缩展开的方法
Feb 27 #Javascript
JavaScript函数详解
Feb 27 #Javascript
浅谈JavaScript的事件
Feb 27 #Javascript
JS实现图片放大镜效果的方法
Feb 27 #Javascript
浅谈javascript中的instanceof和typeof
Feb 27 #Javascript
js实现有时间限制消失的图片方法
Feb 27 #Javascript
js用拖动滑块来控制图片大小的方法
Feb 27 #Javascript
You might like
php文档更新介绍
2011/07/22 PHP
Laravel中使用阿里云OSS Composer包分享
2015/02/10 PHP
[原创]PHP正则匹配中英文、数字及下划线的方法【用户名验证】
2017/08/01 PHP
ThinkPHP5.1的权限控制怎么写?分享一个AUTH权限控制
2021/03/09 PHP
javascript实现面向对象类的功能书写技巧
2010/03/07 Javascript
Jquery中val()表单取值赋值的实例代码
2013/08/15 Javascript
js获取当前页面路径示例讲解
2014/01/08 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
JavaScript html5 canvas绘制时钟效果
2016/03/01 Javascript
Angularjs中controller的三种写法分享
2016/09/21 Javascript
详解handlebars+require基本使用方法
2016/12/21 Javascript
JS实现无缝循环marquee滚动效果
2017/05/22 Javascript
vue如何获取点击事件源的方法
2017/08/10 Javascript
开源一个微信小程序仪表盘组件过程解析
2019/07/30 Javascript
详解微信小程序工程化探索之webpack实战
2020/04/20 Javascript
JSON stringify方法原理及实例解析
2020/10/23 Javascript
Python中暂存上传图片的方法
2015/02/18 Python
Python只用40行代码编写的计算器实例
2017/05/10 Python
Python 高级专用类方法的实例详解
2017/09/11 Python
python使用RNN实现文本分类
2018/05/24 Python
Python3 log10()函数简单用法
2019/02/19 Python
解决python super()调用多重继承函数的问题
2019/06/26 Python
python3检查字典传入函数键是否齐全的实例
2020/06/05 Python
Python 如何测试文件是否存在
2020/07/31 Python
Python中logging日志的四个等级和使用
2020/11/17 Python
英国家庭、花园、汽车和移动解决方案:Easylife Group
2018/05/23 全球购物
印度在线购物网站:Paytmmall
2019/07/24 全球购物
当x.equals(y)等于true时,x.hashCode()与y.hashCode()可以不相等,这句话对不对
2015/05/02 面试题
金融专业推荐信
2013/11/14 职场文书
小学生安全保证书
2014/02/01 职场文书
畜牧兽医本科生的自我评价
2014/03/03 职场文书
寻找最美家庭活动方案
2014/08/20 职场文书
办公楼租房协议书范本
2014/11/25 职场文书
国家助学金感谢信
2015/01/21 职场文书
生产实习心得体会范文
2016/01/22 职场文书
写好Python代码的几条重要技巧
2021/05/21 Python