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从头学起(基本数据类型和引用类型的参数传递详细分析)
Feb 16 Javascript
js控制表单奇偶行样式的简单方法
Jul 31 Javascript
js如何获取兄弟、父类等节点
Jan 06 Javascript
Javascript定义类(class)的三种方法详解
Mar 13 Javascript
JS+CSS实现表格高亮的方法
Aug 05 Javascript
jquery验证手机号是否正确实例讲解
Nov 17 Javascript
解决前端跨域问题方案汇总
Nov 20 Javascript
详解ES6中的let命令
Apr 05 Javascript
jquery mobile移动端幻灯片滑动切换效果
Apr 15 Javascript
vue项目每30秒刷新1次接口的实现方法
Dec 04 Javascript
微信小程序绑定手机号获取验证码功能
Oct 22 Javascript
详解vue中在父组件点击按钮触发子组件的事件
Nov 13 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之数组学习
2011/05/29 PHP
php中过滤非法字符的具体实现
2013/10/29 PHP
php实现转换ubb代码的方法
2015/06/18 PHP
PHP异常处理Exception类
2015/12/11 PHP
php微信支付接口开发程序
2016/08/02 PHP
PHP+JavaScript实现无刷新上传图片
2017/02/21 PHP
详解php实现页面静态化原理
2017/06/21 PHP
tp5框架的增删改查操作示例
2019/10/31 PHP
jQuery 事件队列调整方法
2009/09/18 Javascript
游览器中javascript的执行过程(图文)
2012/05/20 Javascript
Js 获取Gridview选中行的内容操作步骤
2013/02/05 Javascript
jQuery中$.click()无效问题分析
2015/01/29 Javascript
JavaScript模拟数组合并concat
2016/03/06 Javascript
前端弹出对话框 js实现ajax交互
2016/09/09 Javascript
JS实现微信弹出搜索框 多条件查询功能
2016/12/13 Javascript
微信小程序自定义导航隐藏和显示功能
2017/06/13 Javascript
vuex学习之Actions的用法详解
2017/08/29 Javascript
使用NestJS开发Node.js应用的方法
2018/12/03 Javascript
[05:26]TI10典藏宝瓶套装外观展示
2020/07/03 DOTA
详细解读Python的web.py框架下的application.py模块
2015/05/02 Python
详解Python3操作Mongodb简明易懂教程
2017/05/25 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
2019/11/11 Python
Python高级property属性用法实例分析
2019/11/19 Python
Python如何使用字符打印照片
2020/01/03 Python
使用python实现飞机大战游戏
2020/03/23 Python
使用pandas实现筛选出指定列值所对应的行
2020/12/13 Python
使用HTML5技术开发一个属于自己的超酷颜色选择器
2013/09/22 HTML / CSS
HTML5 canvas画矩形时出现边框样式不一致的解决方法
2013/10/14 HTML / CSS
阿迪达斯荷兰官方网站:adidas荷兰
2018/03/16 全球购物
安踏官方商城:anta.cn
2019/12/16 全球购物
Jones Bootmaker官网:优质靴子和鞋子在线
2020/11/30 全球购物
个性与发展自我评价
2014/02/11 职场文书
史上最牛辞职信
2015/05/13 职场文书
2016年大学光棍节活动总结
2016/04/05 职场文书
Python语法学习之进程的创建与常用方法详解
2022/04/08 Python
Python可视化神器pyecharts之绘制地理图表练习
2022/07/07 Python