面向对象设计

es中有两种属性:数据属性和访问器属性

  • 数据属性:

数据属性包含一个数据值的位置,在这个位置可以读取和写入值,数据属性有4个描述其行为的特性

  1. [[Configurable]]:表示能否通过delete删除属性从而重新第一属性,能否修改属性的特性,或者能否把属性修改为访问器属性,默认为true
  2. [[Enumerable]]:表示能否通过for-in循环返回属性,默认为true
  3. [[Writable]]:表示能否修改属性的值,默认为true
  4. [[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个特性

  1. [[Confingurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性
  2. [[Enumerable]]:表示能否通过for-in循环返回属性.
  3. [[Get]]:在读取属性时调用的函数,默认值为undefined
  4. [[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 创建对象
  1. 工厂模式

工厂模式是软件工程领域一个广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在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(面向对象)的更多相关文章

  1. javascript高级编程笔记01(基本概念)

    1.在html中使用JavaScript 1.  <script> 元素 <script>定义了下列6个属性: async:可选,异步下载外部脚本文件. charset:可选, ...

  2. JavaScript高级程序设计笔记之面向对象

    说起面向对象,大部分程序员首先会想到 类 .通过类可以创建许多具有共同属性以及方法的实例或者说对象.但是JavaScript并没有类的概念,而且在JavaScript中几乎一切皆对象,问题来了,Jav ...

  3. javascript高级编程笔记02(基本概念)

    ParseInt()函数: 由于Number函数在转换字符串时比较复杂而且不合理,我们常常转换字符串都用parseInt函数, Parseint函数规则: 忽略字符串前面的空格,直到找到第一个非空格字 ...

  4. javascript高级编程笔记06(面相对象2)

    1)  构造函数模式 es中的构造函数可以用来创建特定类型的对象,像Object和Array这样的原生构造函数,在运行时会自动出现在执行环境中,此外,也可以创建自定义的构造函数,从而定义自定义对象类型 ...

  5. javascript高级编程笔记04(基本概念)

    Function类型 Es5中规范了另一个函数对象的属性:caller,这个属性中保存着调用当前函数的函数的引用,如果是在全局作用域中调用当前函数,这它的值为null function outer() ...

  6. javascript高级编程笔记03(正则表达式)

    引用类型 检测数组 注:我们实际开发中经常遇到要把数组转化成以逗号隔开,我以前都是join来实现,其实又更简单的方法可以用toString方法,它会自动用逗号隔开转换成字符串,其实toString内部 ...

  7. Android高级编程笔记(四)深入探讨Activity(转)

    在应用程序中至少包含一个用来处理应用程序的主UI功能的主界面屏幕.这个主界面一般由多个Fragment组成,并由一组次要Activity支持.要在屏幕之间切换,就必须要启动一个新的Activity.一 ...

  8. JavaScript高级编程———JSON

    JavaScript高级编程———JSON < script > /*JSON的语法可以表达一下三种类型的值 简单值:使用与javas相同的语法,可以在JSON中表达字符串.数值.布尔值和 ...

  9. JavaScript高级编程———基本包装类型String和单体内置对象Math

    JavaScript高级编程———基本包装类型和单体内置对象 <script> var stringObject = new String("hello world") ...

随机推荐

  1. LeetCode 75

    Sort Colors Given an array with n objects colored red, white or blue, sort them so that objects of t ...

  2. [改善Java代码]避免在构造函数中初始化其他类

    建议35: 避免在构造函数中初始化其他类 构造函数是一个类初始化必须执行的代码,它决定着类的初始化效率,如果构造函数比较复杂,而且还关联了其他类,则可能产生意想不到的问题,我们来看如下代码: publ ...

  3. 【数学,方差运用,暴力求解】hdu-5037 Galaxy (2014鞍山现场)

    话说这题读起来真费劲啊,估计很多人做不出来就是因为题读不懂...... 从题目中提取的几点关键点: 题目背景就是银河系(Rho Galaxy)中的星球都是绕着他们的质心(center of mass) ...

  4. hdu 4251 划分树

    思路:裸的划分树 #include<iostream> #include<algorithm> #include<cstdio> #include<cmath ...

  5. SQLite CRUD操作

    SQLite CRUD操作代码实例: 1:首先创建一个继承了SQLiteOpenHelper类的MyDatabaseHelper类.实现他的onCreate(SQLiteDatabase db) on ...

  6. ComboBoxEdit数据绑定

    ComboBoxEdit也是DevExpress winform控件中经常使用的一个,我们在使用的过程中可能有时需要对ComboBoxEdit控件进行数据绑定,而ComboBoxEdit控件不像 Lo ...

  7. iOS开发--UIKit控件之UISearchBar(搜索栏)

    今天因为需求原因,需要用到搜索控件:之前一直没有用到过这个控件,所以去百度了一下,找到一篇可以说很齐全的资料,感谢这位作者. 然而,我并没有找到可以更改字体大小的属性或方法,希望有知道的告诉我一声,谢 ...

  8. OpenGL5-纹理贴图

    代码下载 #include "CELLWinApp.hpp"#include <gl/GLU.h>#include <assert.h>#include & ...

  9. In-App-Purcharse 官方原文摘要笔记

    这并不是一篇关于 In-App-Purcharse 的专业深入分析文章,只是在初次浏览有关IAP官方文档后记录的一些需要注意的地方,就像是课堂笔记. 因为这是原版.并且涉及到支付的内容,所以就不翻译, ...

  10. GitHub 基本操作流程

    GitHub是最先进的分布式版本控制工具,下面是我学习中总结的操作流程,仅供参考 ----------------------------------------------------------- ...