javascript高级编程笔记05(面向对象)
面向对象设计
es中有两种属性:数据属性和访问器属性
- 数据属性:
数据属性包含一个数据值的位置,在这个位置可以读取和写入值,数据属性有4个描述其行为的特性
- [[Configurable]]:表示能否通过delete删除属性从而重新第一属性,能否修改属性的特性,或者能否把属性修改为访问器属性,默认为true
- [[Enumerable]]:表示能否通过for-in循环返回属性,默认为true
- [[Writable]]:表示能否修改属性的值,默认为true
- [[Value]]:包含这个属性的数据值默认为undefined
要修改属性默认的特性,必须使用es5的object.defineProperty方法,这个方法接收三个参数:属性所在的对象、属性的名字和一个描述符对象,其中,描述符对象的属性必须是:configurable、enumerable、writable和value,设置其中一个或多个值,可以修改对应的特性值,例如:
var person = {};
Object.defineProperty(preson, "name", {
weitable: false,
Value: "Nicholas"
});
alert(person.name);//”Nicholas”
person.name = "Greg";
alert(person.name)//”Nicholas”
注意:ie8是第一个实现object.defineProperty方法的浏览器版本,然而,这个版本的实现存在诸多限制:只能在DOM对象上使用这个方法,而且只能创建访问器属性,由于实现不彻底,建议读者不要在ie8中使用此方法.
- l 访问器属性:
访问器属性不包含数据值;他们包含一对getter和setter函数在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值,在写入访问器属性时,会调用setter函数并传入新值,访问器属性有如下4个特性
- [[Confingurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性
- [[Enumerable]]:表示能否通过for-in循环返回属性.
- [[Get]]:在读取属性时调用的函数,默认值为undefined
- [[Set]]:在写入属性时调用的函数,默认为undefined
访问器属性不能直接定义,必须使用Objiect.defineProperty来定义.
- l 定义多个属性
由于未对象定义多个属性的可能性很大,es5又定义了一个Object.difineProperties方法,利用这个方法可以通过描述符一次定义多个属性,这个方法接收两个对象参数;第一个对象是要添加和修改其属性的对象,第二个对象的属性与第一个对象中要添加或修改的属性一一对应.
例如:
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;
}
}
}
})
- l 读取属性的特性
在es5中Object.getOwnPropertyDescriptor方法,可以取得给定属性的描述符,这个方法接收两个参数:属性所在的对象和要读取描述的属性名称,返回值是一个对象,如果是访问器属性,这个对象的属性有configurable,enumerable,get和set;如果是数据属性,这个对象的属性有configurable,enumerable,writable和value.例如:
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;
}
}
}
});
var descriptor=Object.getOwnPropertyDescriptor(book,"_year");
alert(descriptor.value)//
alert(descriptor.configurable);//false
alert(typeof descriptor.get);//undefined
var descriptor=Object.getOwnPropertyDescriptor(book,"year");
alert(descriptor.value);//underfined
alert(descriptor.enumerable);//false
alert(typeof descriptor.get);//function
- l 创建对象
- 工厂模式
工厂模式是软件工程领域一个广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在javascript中的实现).
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("Nicholas",29,"Software Enginneer");
var person2=createPerson("Greg",27,"Doctor");
javascript高级编程笔记05(面向对象)的更多相关文章
- javascript高级编程笔记01(基本概念)
1.在html中使用JavaScript 1. <script> 元素 <script>定义了下列6个属性: async:可选,异步下载外部脚本文件. charset:可选, ...
- JavaScript高级程序设计笔记之面向对象
说起面向对象,大部分程序员首先会想到 类 .通过类可以创建许多具有共同属性以及方法的实例或者说对象.但是JavaScript并没有类的概念,而且在JavaScript中几乎一切皆对象,问题来了,Jav ...
- javascript高级编程笔记02(基本概念)
ParseInt()函数: 由于Number函数在转换字符串时比较复杂而且不合理,我们常常转换字符串都用parseInt函数, Parseint函数规则: 忽略字符串前面的空格,直到找到第一个非空格字 ...
- javascript高级编程笔记06(面相对象2)
1) 构造函数模式 es中的构造函数可以用来创建特定类型的对象,像Object和Array这样的原生构造函数,在运行时会自动出现在执行环境中,此外,也可以创建自定义的构造函数,从而定义自定义对象类型 ...
- javascript高级编程笔记04(基本概念)
Function类型 Es5中规范了另一个函数对象的属性:caller,这个属性中保存着调用当前函数的函数的引用,如果是在全局作用域中调用当前函数,这它的值为null function outer() ...
- javascript高级编程笔记03(正则表达式)
引用类型 检测数组 注:我们实际开发中经常遇到要把数组转化成以逗号隔开,我以前都是join来实现,其实又更简单的方法可以用toString方法,它会自动用逗号隔开转换成字符串,其实toString内部 ...
- Android高级编程笔记(四)深入探讨Activity(转)
在应用程序中至少包含一个用来处理应用程序的主UI功能的主界面屏幕.这个主界面一般由多个Fragment组成,并由一组次要Activity支持.要在屏幕之间切换,就必须要启动一个新的Activity.一 ...
- JavaScript高级编程———JSON
JavaScript高级编程———JSON < script > /*JSON的语法可以表达一下三种类型的值 简单值:使用与javas相同的语法,可以在JSON中表达字符串.数值.布尔值和 ...
- JavaScript高级编程———基本包装类型String和单体内置对象Math
JavaScript高级编程———基本包装类型和单体内置对象 <script> var stringObject = new String("hello world") ...
随机推荐
- C# Windows Service服务的创建和调试
前言 关于Windows服务创建和调试的文章在网络上的很多文章里面都有,直接拿过来贴在这里也不过仅仅是个记录,不会让人加深印象.所以本着能够更深刻了解服务项目的创建和调试过程及方法的目的,有了这篇记录 ...
- Acrobat 2015 win32破解版
Acrobat 2015 win32破解版,带破解补丁dll覆盖即可 百度云盘:http://pan.baidu.com/s/1i4tFnNJ
- ActiveMQ(5.10.0) - Destination-level authorization
To build upon authentication, consider a use case requiring more fine-grained control over clients t ...
- Linux 命令 - ping: 向网络主机发送 ICMP ECHO_REQUEST 包
ping 命令会向指定的网络主机发送特殊网络数据报 IMCP ECHO_REQUEST.多数网络设备收到该数据包后会做出回应,通过此法即可验证网络连接是否正常. 有时从安全角度出发,通常会配置部分网络 ...
- SQL Server 2008下日志清理方法
1.将数据库设置成 简单 模式 选择要收缩的数据库,点右键 属性->选项,选择 简单模式 2.选择任务->收缩->文件 3.选择日志
- .NET中开源CMS目录
提起开源cms,大家第一想到的是php的cms,因为php开源的最早,也最为用户和站长们认可,随着各大cms系统的功能的不断完善和各式各样的开源cms的出现,.net和java的高端的cms系统也逐渐 ...
- 企业SAAS的春天,将以手机应用的形式,即将到来
派尔科技吴春福 *本文是派尔为什么要投身企业移动应用的内部分享文章: *我没有仔细核查资料,仅代表个人看法,思路也是在整理过程,逻辑未必很完整,看官将就着看. 企业SAAS,概念起源是N年前,先行者也 ...
- JavaScript代码检查工具 — JSHint
静态代码检查是开发工作中不可缺少的一环,毕竟对于程序化的工作人的眼睛是不可靠的,更何况是自己的眼睛看自己的代码.即使最后的运行结果通过,但可能存在一些未定义的变量.定义了但最后没用过的变量.分号有没有 ...
- 页面get请求 中文参数方法乱码问题
对于get方式,请求参数中存在中文,可以使用下面的方法进行处理: 两次使用encodeURI()方法:例如:encodeURI(encodeURI(“中文”)),然后再服务器中使用URLDecoder ...
- 简介spring中MethodReplacer的用法
欢迎转载交流:个人博客地址http://www.cnblogs.com/shizhongtao/p/3468713.html org.springframework.beans.factory.sup ...