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的文本框与autocomplete结合使用(asp.net+json)
May 30 Javascript
JavaScript起点(严格模式深度了解)
Jan 28 Javascript
jQuery+canvas实现的球体平抛及颜色动态变换效果
Jan 28 Javascript
jQuery中iframe的操作(点击按钮新增窗口)
Apr 20 Javascript
JavaScript判断是否是微信浏览器
Jun 13 Javascript
jQuery中页面返回顶部的方法总结
Dec 30 Javascript
原生js实现节日时间倒计时功能
Jan 18 Javascript
canvas 实现中国象棋
Feb 17 Javascript
vue v-for循环重复数据无法添加问题解决方法【加track-by='索引'】
Mar 15 Javascript
在vue项目中使用sass语法问题
Jul 18 Javascript
vue如何实现动态加载脚本
Feb 05 Javascript
vue-router 2.0 跳转之router.push()用法说明
Aug 12 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
论坛头像随机变换代码
2006/10/09 PHP
str_replace只替换一次字符串的方法
2013/04/09 PHP
PHP实现动态柱状图改进版
2015/03/30 PHP
PHP二维数组矩形转置实例
2016/07/20 PHP
PHP正则匹配日期和时间(时间戳转换)的实例代码
2016/12/14 PHP
使用PHPWord生成word文档的方法详解
2019/06/06 PHP
javascript 循环读取JSON数据的代码
2010/07/17 Javascript
javascript中encodeURI和decodeURI方法使用介绍
2013/05/06 Javascript
把jquery 的dialog和ztree结合实现步骤
2013/08/02 Javascript
javascript获取鼠标位置部分的实例代码(兼容IE,FF)
2013/08/05 Javascript
Android中的jQuery:AQuery简介
2014/05/06 Javascript
vue2.0中vue-cli实现全选、单选计算总价格的实例代码
2017/07/18 Javascript
webpack打包js的方法
2018/03/12 Javascript
angular实现页面打印局部功能的思考与方法
2018/04/13 Javascript
小程序云函数调用API接口的方法
2019/05/17 Javascript
ES6中字符串的使用方法扩展
2019/06/04 Javascript
layer实现弹出层自动调节位置
2019/09/05 Javascript
[11:27]《一刀刀一天》之DOTA全时刻20:TI4总奖金突破920W TS赛事分析
2014/06/18 DOTA
[50:58]2018DOTA2亚洲邀请赛3月29日 小组赛A组OpTic VS Newbee
2018/03/30 DOTA
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
2017/08/18 Python
python输出带颜色字体实例方法
2019/09/01 Python
Python JSON编解码方式原理详解
2020/01/20 Python
使用keras实现Precise, Recall, F1-socre方式
2020/06/15 Python
解决python pandas读取excel中多个不同sheet表格存在的问题
2020/07/14 Python
pandas按条件筛选数据的实现
2021/02/20 Python
浅析HTML5 Landmark
2020/09/11 HTML / CSS
Merrell美国官网:美国登山运动鞋品牌
2018/02/07 全球购物
我的珠宝盒:Ma boîte à bijoux
2019/08/27 全球购物
意大利包包和行李箱销售网站:Bagaglio.it
2021/03/02 全球购物
初中生期末考试的自我评价
2013/12/17 职场文书
《我的第一本书》教学反思
2014/02/15 职场文书
区级文明单位申报材料
2014/05/15 职场文书
十佳中学生事迹材料
2014/06/02 职场文书
课内比教学心得体会
2014/09/09 职场文书
党的群众路线教育实践活动个人整改措施范文
2014/11/04 职场文书