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开发技术大全-第3章 js数据类型
Jul 03 Javascript
javascript中的绑定与解绑函数应用示例
Jun 24 Javascript
js获取URL的参数的方法(getQueryString)示例
Sep 29 Javascript
我的Node.js学习之路(二)NPM模块管理
Jul 06 Javascript
JS实现自适应高度表单文本框的方法
Feb 25 Javascript
bootstrap table复杂操作代码
Nov 01 Javascript
js+html5实现页面可刷新的倒计时效果
Jul 15 Javascript
解决Vue.js由于延时显示了{{message}}引用界面的问题
Aug 25 Javascript
关于vue v-for循环解决img标签的src动态绑定问题
Sep 18 Javascript
微信小程序获取用户openid的实现
Dec 24 Javascript
基于jQuery的时间戳与日期间的转化
Jun 21 jQuery
vue ajax 拦截原理与实现方法示例
Nov 29 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中Session的概念
2006/10/09 PHP
屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码
2007/04/01 Javascript
比较全的JS checkbox全选、取消全选、删除功能代码
2008/12/19 Javascript
js onpropertychange输入框 事件获取属性
2009/03/26 Javascript
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
2011/04/01 Javascript
javascript插入样式实现代码
2012/02/22 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
JavaScript简单实现鼠标拖动选择功能
2014/03/06 Javascript
js或jquery实现页面打印可局部打印
2014/03/27 Javascript
浅谈javascript中基本包装类型
2015/06/03 Javascript
基于JavaScript实现TAB标签效果
2016/01/12 Javascript
jQuery实现订单提交页发送短信功能前端处理方法
2016/07/04 Javascript
Bootstrap3 多选和单选框(checkbox)
2016/12/29 Javascript
Ionic + Angular.js实现验证码倒计时功能的方法
2017/06/12 Javascript
详解Vue用自定义指令完成一个下拉菜单(select组件)
2017/10/31 Javascript
jQuery实现鼠标移入移出事件切换功能示例
2018/09/06 jQuery
express express-session的使用小结
2018/12/12 Javascript
微信小程序时间轴实现方法示例
2019/01/14 Javascript
详解使用React.memo()来优化函数组件的性能
2019/03/19 Javascript
JS数组Object.keys()方法的使用示例
2019/06/05 Javascript
vue制作抓娃娃机的示例代码
2020/04/17 Javascript
JS字符串和数组如何实现相互转化
2020/07/02 Javascript
design vue 表格开启列排序的操作
2020/10/28 Javascript
Python实现输出程序执行进度百分比的方法
2017/09/16 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
2020/03/06 Python
浅谈Python中re.match()和re.search()的使用及区别
2020/04/14 Python
python3 循环读取excel文件并写入json操作
2020/07/14 Python
中国京东和泰国中央集团合资的网站:JD CENTRAL
2020/08/22 全球购物
2014银行授权委托书样本
2014/10/04 职场文书
2015年银行柜员工作总结报告
2015/04/01 职场文书
2016应届毕业生实习心得体会
2015/10/09 职场文书
读《皮囊》有感:理解是对他人的最大的善举
2019/11/14 职场文书
Django使用redis配置缓存的方法
2021/06/01 Redis
JavaScript小技巧带你提升你的代码技能
2021/09/15 Javascript
详细介绍MySQL中limit和offset的用法
2022/05/06 MySQL
Redis sentinel哨兵集群的实现步骤
2022/07/15 Redis