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 相关文章推荐
javascript的函数、创建对象、封装、属性和方法、继承
Mar 10 Javascript
JavaScript获取FCK编辑器信息的具体方法
Jul 12 Javascript
浅谈利用JavaScript进行的DDoS攻击原理与防御
Jun 04 Javascript
基于vue2.0实现的级联选择器
Jun 09 Javascript
Vue单页式应用(Hash模式下)实现微信分享的实例
Jul 21 Javascript
ES6中的Promise代码详解
Oct 09 Javascript
promise和co搭配生成器函数方式解决js代码异步流程的比较
May 25 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
Jun 05 Javascript
jquery+css实现Tab栏切换的代码实例
May 14 jQuery
js 实现ajax发送步骤过程详解
Jul 25 Javascript
angularjs自定义过滤器demo示例
Aug 24 Javascript
小程序跳转到的H5页面再跳转回跳小程序的方法
Mar 06 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
thinkphp实现163、QQ邮箱收发邮件的方法
2015/12/18 PHP
记录Yii2框架开发微信公众号遇到的问题及解决方法
2018/07/20 PHP
js获取事件源及触发该事件的对象
2013/10/24 Javascript
使用JavaScript获取地址栏参数的方法
2014/12/19 Javascript
jquery实现漫天雪花飞舞的圣诞祝福雪花效果代码分享
2015/08/20 Javascript
JavaScript中的各种操作符使用总结
2016/05/26 Javascript
Nodejs全局安装和本地安装的不同之处
2016/07/04 NodeJs
探索Vue.js component内容实现
2016/11/03 Javascript
jQuery.Validate表单验证插件的使用示例详解
2017/01/04 Javascript
详解nodejs中express搭建权限管理系统
2017/09/15 NodeJs
vue router学习之动态路由和嵌套路由详解
2017/09/21 Javascript
浅谈Vue SSR 的 Cookies 问题
2017/11/20 Javascript
详解vue axios用post提交的数据格式
2018/08/07 Javascript
使用rollup打包JS的方法步骤
2018/12/05 Javascript
python 3.7.0 下pillow安装方法
2018/08/27 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
2019/03/01 Python
Python3转换html到pdf的不同解决方案
2019/03/11 Python
Python基础学习之函数方法实例详解
2019/06/18 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
2020/09/11 Python
Python实现冒泡排序算法的完整实例
2020/11/04 Python
Pandas数据分析的一些常用小技巧
2021/02/07 Python
HTML5 语音搜索只需一句代码
2013/01/03 HTML / CSS
台湾最大银发乐活百货:乐龄网
2018/05/21 全球购物
探索欧洲最好的品牌:Bombinate
2019/06/14 全球购物
印度在线购物网站:Paytmmall
2019/07/24 全球购物
高级Java程序员面试要点
2013/08/02 面试题
大学生咖啡店创业计划书
2014/01/21 职场文书
工程管理专业毕业生自荐信
2014/01/24 职场文书
给老师的检讨书
2014/02/11 职场文书
致标枪运动员加油稿
2014/02/15 职场文书
2014第二批党的群众路线教育实践活动对照检查材料思想汇报
2014/09/18 职场文书
大学生考试作弊检讨书1000字
2014/10/14 职场文书
死亡证明书样本说明
2014/10/18 职场文书
2014年双拥工作总结
2014/11/21 职场文书
PyTorch的Debug指南
2021/05/07 Python
基于Python实现西西成语接龙小助手
2022/08/05 Golang