JavaScript高级程序设计12.pdf
第六章 面向对象的程序设计
ECMA中有两种属性:数据属性和访问器属性
数据属性的特性
[[Configurable]] 表示是否通过delete删除属性,是否重新定义属性,是否能把属性修改为访问器属性
[[Enumerable]] 表示是否通过for-in循环返回属性
[[writable]] 表示是否修改属性的值
[[Value]] 包含这个属性的数据值,从这个属性里读取数据值
要修改属性默认的特效必须使用ECMAScript 5的Object.defineProperty()方法,它接收3个参数:属性所在的对象,属性的名字和描述符对象(上面的4个描述符对象的属性)
var person={};
Object.defineProperty(peron,"name",{
writable:false,
value:"Nicholas"
});
alert(person.name); //"Nicholas"
person.name="Greg";
alert(person.name); //"Nicholas"
一旦把configurable设置为false,就不能改为true,此后只能更改writable属性
访问器属性
访问器属性不包含数据值;它们包含一对getter和setter函数(两个都不是必须的),有以下4个特性
[[Configurable]] 表示是否通过delete删除属性,是否重新定义属性,是否能把属性修改为数据属性
[[Enumerable]] 表示是否通过for-in循环返回属性
[[Get]] 读取属性时调用的函数,默认为undefined
[[Set]] 写入属性时调用的函数,默认为undefined
用Object.defineProperty()来定义
var book={
_year:2004,
edition:1
};
Object.defineProperty(book,"year",{
get:function(){
return this._year;
},
set:function(newValue){
if (newValue > 2004) {
this._year=newValue;
this.edition +=newValue-2004;
}
}
});
book.year=2005;
alert(book.edition); //2
不一定要同时指定getter和setter,严格模式下写入只指定getter函数会抛出异常,非严格模式下返回undefined,反之亦然
定义多个属性 Object.defineProperties()方法
var book={};
Object.defineProperties(book,{
_year:{
value:2004},
edition:{
value:1},
year:{
get: function(){
return this_year;},
set: function(newValue){
if(newValue>2004){
this._year=newValue;
this.edition+=newValue-2004;}
}
}
});
读取属性的特性 Object.getOwnPropertyDescriptor()方法
以以上为例
var descriptor=Object.getOwnPropertyDescriptor(book,"_year");
alert(descriptor.value); //2004
alert(descriptor.configurable); //false
工厂模式
function createPerson(name,age,job){
var o =new Object();
o.name=name;
o.age=age;
o.job=job;
o.sayName=function(){
alert(this.name);
};
return o;
}
var person1=createPerson("Greg",25,"Doctor");
构造函数模式(自定义构造函数)
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=function(){
alert(this.name);
};
}
var person1=new Person("Greg",25,"Doctor");
alert(person1 instanceof Person); //true
alert(person1.constructor==Person); //true
创建自定义的构造函数可以将它的实例标识为一种特定的类型,这是胜过工厂模式的地方
构造函数是比较特殊的函数,可以不使用new标识符(new其实就是在后台创建一个新对象),this就是指向当前作用域
Person("Greg",27,"Doctor"); //添加到window
window.sayName(); //"Greg"
可以使用call()、apply()
var o=new Object();
Person.call(o,"kristen",25,"Nurse");
o.sayName(); //"kristen"
构造函数模式缺点是每个方法都要在实例上创建一遍,所以每个实例里的同名函数都是不同的
原型模式
实例有一个prototype属性指向函数的原型对象,原型对象有一个constructor属性指向构造函数
person.prototype()
person.prototype.constructor()
可以通过isPrototypeOf()方法确定对象之间是否存在这种关系
alert(person.prototype.isPrototypeOf(person1)); //true
可以通过Object.getPrototypeOf()返回[[Prototype]]的值
alert(Object.getPrototype(person1)==person.prototype); //true
在搜索一个对象的属性时,会先搜索实例,如没有再搜索原型,如有则屏蔽原型的属性,delete可以删除实例的属性,从而访问到原型中的属性
delete person1.name;
JavaScript高级程序设计12.pdf的更多相关文章
- JavaScript高级程序设计53.pdf
共有的表单字段方法 每个表单字段都有两个方法:focus()和blur(),其中focus()用于将浏览器焦点设置到表单字段,激活表单字段.可以侦听页面的load事件 EventUtil.addHan ...
- JavaScript高级程序设计30.pdf
第12章 DOM2和DOM3 DOM1级主要定义的是HTML和XML文档的底层结构.DOM2和DOM3则在这个结构的基础上引入了更多的交互能力,也支持更高级的XML特性 DOM2和DOM3级分为许多模 ...
- JavaScript高级程序设计21.pdf
第10章 DOM DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序编程接口) IE中所有DOM对象都是以COM对象的形式实现的,这意味着IE中的对象与原生JavaScript对象 ...
- JavaScript高级程序设计61.pdf
JSON对象 早期的JSON解析器就是使用JavaScript的eval()函数,ECMAScript5对解析JSON的行为做出了规定,定义了全局对象JSON. JSON对象有2个方法:stringi ...
- JavaScript高级程序设计60.pdf
错误处理 try-catch语句 try{ //可能会导致错误的代码 }catch(error){ //在错误发生时如何处理 } error是一个包含着错误信息的对象,它有一个message属性,保存 ...
- JavaScript高级程序设计58.pdf
15章 使用Canvas绘图 略 16章 HTML5脚本编程 HTML5规范了新的HTML标记和JavaScript API,以便简化创建动态Web界面的工作 跨文档消息传递 简称XDM,指来自不同域 ...
- JavaScript高级程序设计57.pdf
表单序列化 首先了解一下浏览器如何将数据发送给服务器 对表单字段的名称和值进行URL编码,使用和号(&)分隔 不发送禁用的表单字段 只发送勾选的复选框和单选按钮 不发送type为“reset” ...
- JavaScript高级程序设计55.pdf
输入模式 HTML5为文本字段新增了pattern属性,这个属性的值是一个正则表达式,用于匹配文本框中的值 例如,只想在允许在文本字段中输入数值 <input type="text&q ...
- JavaScript高级程序设计54.pdf
过滤输入 对于一些浏览器,可以使用正则表达式里的text()测试用户按下的按键,Firefox和safari(3.1版本之前)会对向上向下.退格键和删除键触发keypress事件,在Firefox中, ...
随机推荐
- hibernate - Transaction not successfully started
今天在测试 transaction(使用事务进行管理)的时候, 总报错: Transaction not successfully started 可能有多种原因, 这位哥们总结得很好: Transa ...
- 动态库DLL加载方式-静态加载和动态加载
静态加载: 如果你有a.dll和a.lib,两个文件都有的话可以用静态加载的方式: message函数的声明你应该知道吧,把它的声明和下面的语句写到一个头文件中 #pragma comment(lib ...
- MyBatis的学习总结六:Mybatis的缓存【参考】
一.Mybatis缓存介绍 正如大多数持久层框架一样,Mybatis同样提供了一级缓存和二级缓存 1.一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为Session, ...
- web开发基础(同步更新中)
1/Get与Post的区别 GET是我们都熟悉的.它用于请求网页文本.当你在浏览器输入harvard.edu,它会直接访问Harvard的web服务器,去GET /. 第二个最有名的是POST,它经常 ...
- iOS 使用GBK编码的hmacMD5算法
该方法是写在工具类中的,而不是写在NSString的类别中 方法的声明: /** * 使用hmac-md5加密 * * @param clearText 原文 * @param secret ...
- Linux的more、less
2.more 文件内容或输出查看工具: more 是我们最常用的工具之一,最常用的就是显示输出的内容,然后根据窗口的大小进行分页显示,然后还能提示文件的百分比: de>[root@localho ...
- float浮动引起的ul高度崩溃与overflow的关系
今天遇到的问题真的让人不得不吐槽,因为一个很小的问题,花费了半天的时间来才解决这个问题.一直认为自己对Html与Css了解应该算蛮不错的,但是今天遇到的事情让我不得不反省自己的学习心态上的错误 ...
- jQuery 获取父元素、子元素、同级元素
详情:http://www.w3school.com.cn/jquery/jquery_traversing_ancestors.asp parent() 方法返回被选元素的直接父元素.(常用) ...
- python中跟字符串相关的一些操作
公司让用python自动生成代码,以前没看过python.所以匆匆的看了两天python就连猜带蒙就上马开干了..因此好多操作可能看的时候看懂了,用的时候知道有这么个东西,具体用法就忘记了..用到了就 ...
- "The connection for the USB device '###' was unsuccessful. The device is currently in use"
一.问题描述 1.情景描述 笔者的物理主机系统是“windows7 64位”,想使用“摄像头录像大师”.这个软件在录制视频的过程中,需要调用windows自带的"windows media ...