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 淡入淡出效果的简单实现
Feb 07 Javascript
jQuery对val和atrr(&quot;value&quot;)赋值的区别介绍
Sep 26 Javascript
JQuery遍历json数组的3种方法
Nov 08 Javascript
Bootstrap CSS组件之下拉菜单(dropdown)
Dec 17 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
Feb 08 Javascript
vue2.0数据双向绑定与表单bootstrap+vue组件
Feb 27 Javascript
在create-react-app中使用css modules的示例代码
Jul 31 Javascript
element-ui中的select下拉列表设置默认值方法
Aug 24 Javascript
js实现倒计时秒杀效果
Mar 25 Javascript
vue样式穿透 ::v-deep的具体使用
Jun 04 Javascript
TypeScript中条件类型精读与实践记录
Oct 05 Javascript
详解Vue slot插槽
Nov 20 Vue.js
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
用header 发送cookie的php代码
2007/03/16 PHP
PHP cron中的批处理
2008/09/16 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
jQuery链式操作如何实现以及为什么要用链式操作
2013/01/17 Javascript
浅析JavaScript中的事件机制
2015/06/04 Javascript
JavaScript的函数式编程基础指南
2016/03/19 Javascript
JS简单获取及显示当前时间的方法
2016/08/03 Javascript
js实现select选择框效果及美化
2016/08/19 Javascript
微信小程序  简单实例(阅读器)的实例开发
2016/09/29 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
2016/12/28 Javascript
ES6中箭头函数的定义与调用方式详解
2017/06/02 Javascript
详解jQuery同步Ajax带来的UI线程阻塞问题及解决办法
2017/08/09 jQuery
JS实现的3des+base64加密解密算法完整示例
2018/05/18 Javascript
vue动画之点击按钮往上渐渐显示出来的实例
2018/09/29 Javascript
基于VUE实现判断设备是PC还是移动端
2020/07/03 Javascript
JavaScript点击按钮生成4位随机验证码
2021/01/28 Javascript
Python实现子类调用父类的方法
2014/11/10 Python
python实现的简单猜数字游戏
2015/04/04 Python
python算法表示概念扫盲教程
2017/04/13 Python
用python统计代码行的示例(包括空行和注释)
2018/07/24 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
2018/12/02 Python
python爬虫之验证码篇3-滑动验证码识别技术
2019/04/11 Python
python高斯分布概率密度函数的使用详解
2019/07/10 Python
利用Python产生加密表和解密表的实现方法
2019/10/15 Python
pytorch:model.train和model.eval用法及区别详解
2020/02/20 Python
Python基于当前时间批量创建文件
2020/05/07 Python
HTML5 video 上传预览图片视频如何设置、预览视频某秒的海报帧
2018/08/28 HTML / CSS
FILA德国官方网站:来自意大利的体育和街头服饰品牌
2019/07/19 全球购物
MVC的各个部分都有那些技术来实现?如何实现?
2016/04/21 面试题
刊首寄语大全
2014/04/11 职场文书
2014中学教师节广播稿
2014/09/10 职场文书
《改造我们的学习》心得体会
2014/11/07 职场文书
计划生育目标责任书
2015/05/09 职场文书
JS创建或填充任意长度数组的小技巧汇总
2021/10/24 Javascript
mysql 排序失效
2022/05/20 MySQL
Python TypeError: ‘float‘ object is not subscriptable错误解决
2022/12/24 Python