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 相关文章推荐
SWFObject 2.1以上版本语法介绍
Jul 10 Javascript
理解Javascript_15_作用域分配与变量访问规则,再送个闭包
Oct 20 Javascript
jQuery焦点图切换特效代码分享
Sep 15 Javascript
浅谈DOM的操作以及性能优化问题-重绘重排
Jan 08 Javascript
jQuery给表格添加分页效果
Mar 02 Javascript
JS实现可视化文件上传
Sep 08 Javascript
vue观察模式浅析
Sep 25 Javascript
vue router的基本使用和配置教程
Nov 05 Javascript
JS实现的Object数组去重功能示例【数组成员为Object对象】
Feb 01 Javascript
jQuery提示框插件SweetAlert用法分析
Aug 05 jQuery
js+h5 canvas实现图片验证码
Oct 11 Javascript
vue el-upload上传文件的示例代码
Dec 21 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
PHP类的使用 实例代码讲解
2009/12/28 PHP
PHP Curl出现403错误的解决办法
2014/05/29 PHP
php数组索引的Key加引号和不加引号的区别
2014/08/19 PHP
thinkphp在模型中自动完成session赋值示例代码
2014/09/09 PHP
十幅图告诉你什么是PHP引用
2015/02/22 PHP
WordPress开发中用于获取近期文章的PHP函数使用解析
2016/01/05 PHP
PHP7 错误处理机制修改
2021/03/09 PHP
js Dialog 实践分享
2012/10/22 Javascript
Javascript无阻塞加载具体方式
2013/06/28 Javascript
Extjs改变树节点的勾选状态点击按钮将复选框去掉
2013/11/14 Javascript
基于jQuery实现选取月份插件附源码下载
2015/12/28 Javascript
js实现input密码框提示信息的方法(附html5实现方法)
2016/01/14 Javascript
jQuery插件简单学习实例教程
2016/07/01 Javascript
JavaScript实现简单的树形菜单效果
2017/06/23 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
JavaScript的Proxy可以做哪些有意思的事儿
2019/06/15 Javascript
node 版本切换的实现
2020/02/02 Javascript
[02:51]DOTA2英雄基础教程 艾欧
2014/01/13 DOTA
Python 元组(Tuple)操作详解
2014/03/11 Python
python 捕获 shell/bash 脚本的输出结果实例
2017/01/04 Python
Python 备份程序代码实现
2017/03/06 Python
python微信好友数据分析详解
2018/11/19 Python
Python 判断奇数偶数的方法
2018/12/20 Python
基于python实现图片转字符画代码实例
2020/09/04 Python
python time()的实例用法
2020/11/03 Python
HTML5 Canvas鼠标与键盘事件demo示例
2013/07/04 HTML / CSS
全球最大的服务市场:Fiverr
2017/01/03 全球购物
应届生法律顾问求职信
2013/11/19 职场文书
助人为乐表扬信范文
2014/01/14 职场文书
雪山饭庄的创业计划书范文
2014/01/18 职场文书
党员活动日总结
2014/05/05 职场文书
2014年质量管理工作总结
2014/12/01 职场文书
2014年平安夜寄语
2014/12/08 职场文书
致创业的您:这类人不适合餐饮创业
2019/08/19 职场文书
linux中nohup和后台运行进程查看及终止
2021/06/24 Python
TypeScript中条件类型精读与实践记录
2021/10/05 Javascript