《Javascript权威指南》学习笔记之十:ECMAScript 5 增强的对象模型

本文主要是介绍《Javascript权威指南》学习笔记之十:ECMAScript 5 增强的对象模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、属性和描述符

     1、概述:在ECMAScript 5中,属性模型已经完全被重写了,并规定了value,writable,configurable,enumerable,get和set共6个属性,用于完成不同的功能。例如:

{

value:"属性值",

writable:true,            //定义属性是否可以改变,默认为TRUE

configurable:true,    //定义属性是否可以被删除,默认为TRUE

enumerable:true      //定义属性是否可以迭代,默认为TRUE

}

     2、注意事项

           要使用ECMAScript 5 增强的对象模型定义属性,不能再使用原来的模式。

function Person(){}
Person.prototype.nickName=
{value:"Tom",writable:true,enumerable:true,configurable:true
};var per = new Person;
alert(JSON.stringify(per.nickName));

Google运行结果:


上述的定义并没有应用ECMAScript 5的增强对象模型,属性nickName的值其实是一个对象,而我们想要的仅仅是Tom。


二 、使用ECMAScript 5 增强的对象模型定义属性

     1、定义属性:Object.defineProperty(obj,prop,desc)

          1.1  参数详解:

                  obj是一个对象,若要为一个类的所有实例定义属性,则将该参数指定为该类的原型对象;prop是一个字符串,指定属性名;desc是一个对象,包含属性的描述。

          1.2  重新定义Person

function Person(){}
Object.defineProperty(Person.prototype,"nickName",
{ value:"Tom",writable:true,enumerable:true,configurable:true
});
var per = new Person;
alert(JSON.stringify(per.nickName));

Google运行结果:



    2、定义get和set存取器方法

          Object。defineProperty()也可以用于定义get和set方法,由于get和set方法需要一个中间的私有变量,所以,需要定义一个自执行的匿名函数包含Object.defineProperty()方法的定义。

function Person(){}
(function(){var nick = "Tom";Object.defineProperty(Person.prototype,"nickName",{get:function(){return nick;},set:function(value){nick = value;}});})();
var per1 = new Person;
document.write(per1.nickName+"<br/>");
per1.nickName = "John";
document.write(per1.nickName);

Google运行结果



     3、一次定义多个属性

          Object.defineProperties()可以一次定义或修改多个属性,为Person类定义nickName和age属性

function Person(){}
Object.defineProperties(Person.prototype,{"nickName":{value:"Tom",writable:true},"age":{value:20,configurable:false,writable:false}});


三 、使用ECMAScript 5 增强的对象模型获取属性

       1、Object.getOwnPropertyDescriptor(obj,prop)方法可以获取一个属性的描述信息。

             1.1   参数详解

                    obj是一个对象,指定要获取属性的对象;prop是一个字符串,用于指定要获取的属性名。

function Person(){}
var per = new Person;
Object.defineProperties(per,{"nickName":{value:"Tom",writable:true},"age":{value:20,configurable:false,writable:false}});var age = Object.getOwnPropertyDescriptor(per,"age");
alert(JSON.stringify(age));

Google运行结果



     2、枚举属性

          Object.keys(obj)是一个枚举对象obj所有可以枚举的属性的静态方法,返回值是一组字符串,每个字符串就是属性名。

          Object.getOwnPropertyNames(obj)可以实现同样的功能,但是能列出所有能枚举和不能枚举的属性。该方法不能实现向前兼容,因为ECMAscript3没有相关的方法可以获得不能枚举的属性。



四 、密封对象和动态对象

     1、概述:默认情况下,JS创建的对象都是动态的,允许在运行为对象添加属性和方法。使用ECMAScript 5增强的对象模型,就可以定义密封对象,它是通过object.preventExtensions(obj)、Object.seal(obj)、Object.freeze(obj)等静态方法实现。


     2、Object.preventExtensions(obj):锁定一个对象,密封对象不允许添加新成员。同时提供了Object.isExtensible(obj)方法检查一个对象是否可以增加成员,即是否应用了Object.preventExtensions(obj)方法,没有应用则返回TRUE,否则返回FALSE。obj是要密封的对象,若要密封一个类,该参数可以指定为类的原型对象。

function Person(name,age)
{this.name = name;this.age = age;
}
Person.prototype.show = function()
{document.write("my name is "+this.name+", and age is "+this.age+"<br/>");
};
var per = new Person("康",20);
per.show();
document.write("是否可以添加成员:"+Object.isExtensible(per)+"<br/>");
Object.preventExtensions(per);
document.write("是否可以添加成员:"+Object.isExtensible(per)+"<br/>");
per.hobby = "篮球";                //不能再添加属性
document.write(per.hobby+"<br/>");
document.write(delete per.hobby);   //但是可以删除属性

Google运行结果


     3、Object.seal(obj):锁定一个对象,密封对象不允许添加和删除新成员。同时提供了Object.isSealed(obj)方法检查一个对象是否可以增加成员,即是否应用了Object.preventExtensions(obj)方法,没有应用则返回TRUE,否则返回FALSE。obj是要密封的对象,若要密封一个类,该参数可以指定为类的原型对象。

function Person(name,age)
{this.name = name;this.age = age;
}
Person.prototype.show = function()
{document.write("my name is "+this.name+", and age is "+this.age+"<br/>");
};
var per = new Person("康",20);
per.show();
document.write("是否可以添加成员:"+Object.isSealed(per)+"<br/>");
Object.seal(per);
document.write("是否可以添加成员:"+Object.isSealed(per)+"<br/>");
per.hobby = "篮球";
document.write(per.hobby+"<br/>");
document.write(delete per.age);  //不能删除,返回false

Google运行结果


     4、Object.freeze(obj):锁定一个对象,密封对象不允许添加和删除新成员,所有属性均变为只读。同时提供了Object.isFrozen(obj)方法检查一个对象是否可以增加成员,即是否应用了Object.freeze(obj)方法,没有应用则返回TRUE,否则返回FALSE。obj是要密封的对象,若要密封一个类,该参数可以指定为类的原型对象。

function Person(name,age)
{this.name = name;this.age = age;
}
Person.prototype.show = function()
{document.write("my name is "+this.name+", and age is "+this.age+"<br/>");
};
var per = new Person("康",20);
per.show();
document.write("是否可以添加成员:"+Object.isFrozen(per)+"<br/>");
Object.freeze(per);
document.write("是否可以添加成员:"+Object.isFrozen(per)+"<br/>");
per.age = 25;                //不能改变,仍为20
document.write(per.age+"<br/>");
document.write(delete per.name);

Google运行结果


五 、根据原型对象创建对象

    使用Object.create(proto[,props])方法可以为指定的对象和可选的属性创建一个新对象。proto指向一个对象,该对象作为新建对象的原型对象,props指定要增加的属性,可选。该方法的功能相当于将新创建的对象的原型作为参数,同时使用Object.defineProperties(props)方法定义属性。

这篇关于《Javascript权威指南》学习笔记之十:ECMAScript 5 增强的对象模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1011370

相关文章

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Spring WebFlux 与 WebClient 使用指南及最佳实践

《SpringWebFlux与WebClient使用指南及最佳实践》WebClient是SpringWebFlux模块提供的非阻塞、响应式HTTP客户端,基于ProjectReactor实现,... 目录Spring WebFlux 与 WebClient 使用指南1. WebClient 概述2. 核心依

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os