《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

相关文章

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll