《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

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

Java五子棋之坐标校正

上篇针对了Java项目中的解构思维,在这篇内容中我们不妨从整体项目中拆解拿出一个非常重要的五子棋逻辑实现:坐标校正,我们如何使漫无目的鼠标点击变得有序化和可控化呢? 目录 一、从鼠标监听到获取坐标 1.MouseListener和MouseAdapter 2.mousePressed方法 二、坐标校正的具体实现方法 1.关于fillOval方法 2.坐标获取 3.坐标转换 4.坐

Spring Cloud:构建分布式系统的利器

引言 在当今的云计算和微服务架构时代,构建高效、可靠的分布式系统成为软件开发的重要任务。Spring Cloud 提供了一套完整的解决方案,帮助开发者快速构建分布式系统中的一些常见模式(例如配置管理、服务发现、断路器等)。本文将探讨 Spring Cloud 的定义、核心组件、应用场景以及未来的发展趋势。 什么是 Spring Cloud Spring Cloud 是一个基于 Spring

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

java8的新特性之一(Java Lambda表达式)

1:Java8的新特性 Lambda 表达式: 允许以更简洁的方式表示匿名函数(或称为闭包)。可以将Lambda表达式作为参数传递给方法或赋值给函数式接口类型的变量。 Stream API: 提供了一种处理集合数据的流式处理方式,支持函数式编程风格。 允许以声明性方式处理数据集合(如List、Set等)。提供了一系列操作,如map、filter、reduce等,以支持复杂的查询和转