手机版

Javascript可写特性介绍

时间:2021-10-13 来源:互联网 编辑:宝哥软件园 浏览:

说起js中的特性标签,总觉得有些奇怪。那为什么要谈这个属性,这个属性来源于一个问题?我们都知道窗口对象实际上是。

一个窗口的实例,因为它是一个实例,应该有“属性”和“方法”,例如:

在平时使用函数的时候,我们会定义一些属性,比如姓名、年龄等等,我们还可以对它们进行删除、设置、更新等操作。

那么接下来的问题来了。由于我的person对象的名字是可以动态修改的,按照这个原理,我应该也可以修改窗口下未定义的值,然后我很感兴趣地想看一看。

结果可想而知,我并没有成功修改undefined的值,那么为什么会出现这种情况呢?这说不通。它不是上一篇文章中提到的打包类型,但是我们必须尊重结果,这意味着js的底层一定做了什么导致了这个结果。事实上,js的底层默认使用了written=false标记,以使未定义的属性不被写入。下面我们具体看一下。

1:[可写]功能。

当谈到一个属性是否可写时,您可能会想到C#中的get/set访问器,或者readonly关键字。现在你会对我应该如何只读属性感兴趣。在js中,您只需要使用defineProperty方法。

从上面的例子可以看出三件有趣的事情:

13360我用defineProperty方法把person.name改成了只读字段,所以有人要说,这明明是一个方法,怎么可能是一个特性,一个特性就在我的脑海里。

[xxx]模式,所以这就是js的区别。毕竟js没有语法糖,所以定义特性只能用底部公开的方法来定义,也就是defineProperty。

23360我在方法中看到了不仅可写而且可配置,那么这是什么呢?其实这是基本配置,告诉js引擎是否可以删除和更新属性。当我将可配置设置为false时,您不能删除p.Name,因为这将是一个无效的操作。

看完这些,我想你应该明白为什么未定义的不能删除和更新了。都是奇怪的痕迹,是不是很有趣?

3.下一个值得思考的问题是js引擎是如何做到的。C#中也有一个属性,这个属性经过编译器编译后会记录在元数据中。然后,您可以使用反射放心地获取属性中的任何值,例如Serializable序列化类。它告诉SerializableFormat如何反映读取类,哪些字段可以序列化,哪些不能序列化,如果不能,需要用NonSerialized标记它们。

复制代码如下:[可序列化]公共类测试{[非序列化]公共字符串名称;}

从图中可以看出,名称未列化的特征已经记录在IL中。我们知道js中没有反射,所以突破自然在于defineProperty方法。不幸的是,我们看不到这个方法的底层源代码是什么,所以我们不知道它对名称字段做了什么来动态地使其不可写。我们只能根据自己的理解来猜测js引擎可能的行为。

版权声明:Javascript可写特性介绍是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。