《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中Arrays类和Collections类常用方法示例详解

《Java中Arrays类和Collections类常用方法示例详解》本文总结了Java中Arrays和Collections类的常用方法,涵盖数组填充、排序、搜索、复制、列表转换等操作,帮助开发者高... 目录Arrays.fill()相关用法Arrays.toString()Arrays.sort()A

Spring Boot Maven 插件如何构建可执行 JAR 的核心配置

《SpringBootMaven插件如何构建可执行JAR的核心配置》SpringBoot核心Maven插件,用于生成可执行JAR/WAR,内置服务器简化部署,支持热部署、多环境配置及依赖管理... 目录前言一、插件的核心功能与目标1.1 插件的定位1.2 插件的 Goals(目标)1.3 插件定位1.4 核

如何使用Lombok进行spring 注入

《如何使用Lombok进行spring注入》本文介绍如何用Lombok简化Spring注入,推荐优先使用setter注入,通过注解自动生成getter/setter及构造器,减少冗余代码,提升开发效... Lombok为了开发环境简化代码,好处不用多说。spring 注入方式为2种,构造器注入和setter

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习

Java堆转储文件之1.6G大文件处理完整指南

《Java堆转储文件之1.6G大文件处理完整指南》堆转储文件是优化、分析内存消耗的重要工具,:本文主要介绍Java堆转储文件之1.6G大文件处理的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言文件为什么这么大?如何处理这个文件?分析文件内容(推荐)删除文件(如果不需要)查看错误来源如何避

SpringBoot整合Dubbo+ZK注册失败的坑及解决

《SpringBoot整合Dubbo+ZK注册失败的坑及解决》使用Dubbo框架时,需在公共pom添加依赖,启动类加@EnableDubbo,实现类用@DubboService替代@Service,配... 目录1.先看下公共的pom(maven创建的pom工程)2.启动类上加@EnableDubbo3.实

SpringBoot整合(ES)ElasticSearch7.8实践

《SpringBoot整合(ES)ElasticSearch7.8实践》本文详细介绍了SpringBoot整合ElasticSearch7.8的教程,涵盖依赖添加、客户端初始化、索引创建与获取、批量插... 目录SpringBoot整合ElasticSearch7.8添加依赖初始化创建SpringBoot项

JAVA覆盖和重写的区别及说明

《JAVA覆盖和重写的区别及说明》非静态方法的覆盖即重写,具有多态性;静态方法无法被覆盖,但可被重写(仅通过类名调用),二者区别在于绑定时机与引用类型关联性... 目录Java覆盖和重写的区别经常听到两种话认真读完上面两份代码JAVA覆盖和重写的区别经常听到两种话1.覆盖=重写。2.静态方法可andro

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种