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 相关文章推荐
脚本安需导入(装载)的三种模式的对比
Jun 24 Javascript
使用jquery插件实现图片延迟加载技术详细说明
Mar 12 Javascript
javascript动态加载实现方法一
Aug 22 Javascript
Javascript模仿淘宝信用评价实例(附源码)
Nov 26 Javascript
iOS和Android用同一个二维码实现跳转下载链接的方法
Sep 28 Javascript
浅谈JS封闭函数、闭包、内置对象
Jul 18 Javascript
javascript连接mysql与php通过odbc连接任意数据库的实例
Dec 27 Javascript
微信小程序实现吸顶特效
Jan 08 Javascript
js在HTML的三种引用方式详解
Aug 29 Javascript
一篇文章带你从零快速上手Rollup
Sep 07 Javascript
js实现限定区域范围拖拉拽效果
Nov 20 Javascript
Vue组件简易模拟实现购物车
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框架排名
2013/07/04 PHP
php模板原理讲解
2013/11/13 PHP
PHP速成大法
2015/01/30 PHP
使用SyntaxHighlighter实现HTML高亮显示代码的方法
2010/02/04 Javascript
javascript 构造函数强制调用经验总结
2012/12/02 Javascript
Ext修改GridPanel数据和字体颜色、css属性等
2014/06/13 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
2015/10/30 Javascript
HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
2015/11/25 Javascript
JS 学习总结之正则表达式的懒惰性和贪婪性
2017/07/03 Javascript
浅谈Vuex的状态管理(全家桶)
2017/11/04 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
实例讲解JavaScript预编译流程
2019/01/24 Javascript
VSCode使用之Vue工程配置eslint
2019/04/30 Javascript
解决layui-table单元格设置为百分比在ie8下不能自适应的问题
2019/09/28 Javascript
原生js实现密码强度验证功能
2020/03/18 Javascript
Python isinstance判断对象类型
2008/09/06 Python
Python3基础之基本数据类型概述
2014/08/13 Python
Python实现的检测web服务器健康状况的小程序
2014/09/17 Python
对Python w和w+权限的区别详解
2019/01/23 Python
python groupby 函数 as_index详解
2019/12/16 Python
解决torch.autograd.backward中的参数问题
2020/01/07 Python
python实现启动一个外部程序,并且不阻塞当前进程
2020/12/05 Python
用60行代码实现Python自动抢微信红包
2021/02/04 Python
英国的潮牌鞋履服饰商店:size?
2019/03/26 全球购物
中医药大学毕业生自荐信
2013/11/08 职场文书
工商企业管理专业自荐信范文
2014/04/12 职场文书
项目合作协议书
2014/04/16 职场文书
党的群众路线教育学习材料
2014/05/12 职场文书
大专生求职信
2014/06/29 职场文书
基层党员群众路线教育实践活动个人对照检查材料思想汇报
2014/10/05 职场文书
教师党员个人整改措施
2014/10/27 职场文书
2014年行政工作总结
2014/11/19 职场文书
运动与健康自我评价
2015/03/09 职场文书
走进毛泽东观后感
2015/06/04 职场文书
校园安全学习心得体会
2016/01/18 职场文书
JavaScript parseInt0.0000005打印5原理解析
2022/07/23 Javascript