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判断变量是否空值的代码
Oct 26 Javascript
IE和Firefox的Javascript兼容性总结[推荐收藏]
Oct 19 Javascript
jquery索引在使用中的一些困惑
Oct 24 Javascript
javascript实现的一个带下拉框功能的文本框
May 08 Javascript
jQuery实现监控页面所有ajax请求的方法
Dec 10 Javascript
全面了解函数声明与函数表达式、变量提升
Aug 09 Javascript
bootstrap fileinput实现文件上传功能
Aug 23 Javascript
JS模拟实现哈希表及应用详解
May 04 Javascript
Angular设置别名alias的方法
Nov 08 Javascript
layui当点击文本框时弹出选择框,显示选择内容的例子
Sep 02 Javascript
vue 实现cli3.0中使用proxy进行代理转发
Oct 30 Javascript
element-ui中按需引入的实现
Dec 25 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
PHP4实际应用经验篇(7)
2006/10/09 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
2011/08/22 PHP
Laravel 5框架学习之子视图和表单复用
2015/04/09 PHP
PHP内核探索:哈希表碰撞攻击原理
2015/07/31 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
2017/09/01 PHP
window.showModalDialog参数传递中含有特殊字符的处理方法
2013/06/06 Javascript
JS 修改URL参数(实现代码)
2013/07/08 Javascript
JS实现一键回顶功能示例代码
2013/10/28 Javascript
js快速排序的实现代码
2013/12/08 Javascript
调试代码导致IE出错的避免方法
2014/04/04 Javascript
JavaScript使用slice函数获取数组部分元素的方法
2015/04/06 Javascript
纯js实现瀑布流布局及ajax动态新增数据
2016/04/07 Javascript
JavaScript操作表单实例讲解(上)
2016/06/20 Javascript
js HTML5手机刮刮乐代码
2020/09/29 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
2017/02/12 Javascript
vue-axios使用详解
2017/05/10 Javascript
vue组件父子间通信之综合练习(聊天室)
2017/11/07 Javascript
vue .js绑定checkbox并获取、改变选中状态的实例
2018/08/24 Javascript
vue webpack开发访问后台接口全局配置的方法
2018/09/18 Javascript
js实现搜索栏效果
2018/11/16 Javascript
JavaScript实现图片上传并预览并提交ajax
2019/09/30 Javascript
[04:40]2016国际邀请赛中国区预选赛全程TOP10镜头集锦
2016/07/01 DOTA
Python 爬虫的工具列表大全
2016/01/31 Python
基于Python获取照片的GPS位置信息
2020/01/20 Python
python同义词替换的实现(jieba分词)
2020/01/21 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
2020/02/07 Python
python实现斗地主分牌洗牌
2020/06/22 Python
python else语句在循环中的运用详解
2020/07/06 Python
python文件编写好后如何实践
2020/07/07 Python
html5 div布局与table布局详解
2016/11/16 HTML / CSS
国际化的太阳镜及太阳镜配件零售商:Sunglass Hut
2016/07/26 全球购物
组工干部对照检查材料
2014/08/25 职场文书
社区志愿者服务心得体会
2016/01/22 职场文书
从贫穷到富有,是知识技能和学习力的差别
2019/08/20 职场文书
Python中Cookies导出某站用户数据的方法
2021/05/17 Python
js前端面试常见浏览器缓存强缓存及协商缓存实例
2022/06/21 Javascript