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 相关文章推荐
js中indexof的用法详细解析
Dec 24 Javascript
javascript教程之不完整的继承(js原型链)
Jan 13 Javascript
js加密解密字符串可自定义密码因子
May 13 Javascript
javascript中动态函数用法实例分析
May 14 Javascript
JavaScript中this详解
Sep 01 Javascript
js实现滚动条滚动到某个位置便自动定位某个tr
Jan 20 Javascript
JS面向对象编程详解
Mar 06 Javascript
JS深度拷贝Object Array实例分析
Mar 31 Javascript
jquery获取复选框checkbox的值的简单实现方法
May 26 Javascript
在Vue组件中使用 TypeScript的方法
Feb 28 Javascript
Vue.js中的组件系统
May 30 Javascript
详解JavaScript执行模型
Nov 16 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
使用apache模块rewrite_module (转)
2007/02/14 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
Swoole扩展的6种模式深入详解
2021/03/04 PHP
一个小型js框架myJSFrame附API使用帮助
2008/06/28 Javascript
Javascript变量函数浅析
2011/09/02 Javascript
JavaScript中数组的排序、乱序和搜索实现代码
2011/11/30 Javascript
js三种排序算法分享
2012/08/16 Javascript
基于jquery实现点击左右按钮图片横向滚动
2013/04/11 Javascript
JS操作Cookies的小例子
2013/10/15 Javascript
js验证整数加保留小数点的简单实例
2013/12/02 Javascript
JavaScript 数组中最大最小值
2016/06/05 Javascript
js文件中直接alert()中文出来的是乱码的解决方法
2016/11/01 Javascript
Angularjs中ng-repeat-start与ng-repeat-end的用法实例介绍
2016/12/31 Javascript
js实现日历与定时器
2017/02/22 Javascript
JavaScript 程序错误Cannot use 'in' operator to search的解决方法
2017/07/10 Javascript
iframe高度自适应及隐藏滚动条的实例详解
2017/09/29 Javascript
Vue组件系列开发之模态框
2019/04/18 Javascript
使用JavaScrip模拟实现仿京东搜索框功能
2019/10/16 Javascript
vue把输入框的内容添加到页面的实例讲解
2019/11/11 Javascript
深入webpack打包原理及loader和plugin的实现
2020/05/06 Javascript
Json实现传值到后台代码实例
2020/06/30 Javascript
Ant Design的Table组件去除
2020/10/24 Javascript
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS OG
2018/03/30 DOTA
python实现在字符串中查找子字符串的方法
2015/07/11 Python
Python 中pandas.read_excel详细介绍
2017/06/23 Python
python调用HEG工具批量处理MODIS数据的方法及注意事项
2020/02/18 Python
Python 如何对文件目录操作
2020/07/10 Python
C#中有没有静态构造函数,如果有是做什么用的?
2016/06/04 面试题
文明教师事迹材料
2014/01/16 职场文书
校园公益广告语
2014/03/13 职场文书
食品安全宣传标语
2014/06/07 职场文书
政工例会汇报材料
2014/08/26 职场文书
交通安全横幅标语
2014/10/07 职场文书
PHP策略模式写法
2021/04/01 PHP
HTML5页面音频自动播放的实现方式
2021/06/21 HTML / CSS
Python 中 Shutil 模块详情
2021/11/11 Python