第六章 面向对象的程序设计

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的更多相关文章

  1. JavaScript高级程序设计53.pdf

    共有的表单字段方法 每个表单字段都有两个方法:focus()和blur(),其中focus()用于将浏览器焦点设置到表单字段,激活表单字段.可以侦听页面的load事件 EventUtil.addHan ...

  2. JavaScript高级程序设计30.pdf

    第12章 DOM2和DOM3 DOM1级主要定义的是HTML和XML文档的底层结构.DOM2和DOM3则在这个结构的基础上引入了更多的交互能力,也支持更高级的XML特性 DOM2和DOM3级分为许多模 ...

  3. JavaScript高级程序设计21.pdf

    第10章 DOM DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序编程接口) IE中所有DOM对象都是以COM对象的形式实现的,这意味着IE中的对象与原生JavaScript对象 ...

  4. JavaScript高级程序设计61.pdf

    JSON对象 早期的JSON解析器就是使用JavaScript的eval()函数,ECMAScript5对解析JSON的行为做出了规定,定义了全局对象JSON. JSON对象有2个方法:stringi ...

  5. JavaScript高级程序设计60.pdf

    错误处理 try-catch语句 try{ //可能会导致错误的代码 }catch(error){ //在错误发生时如何处理 } error是一个包含着错误信息的对象,它有一个message属性,保存 ...

  6. JavaScript高级程序设计58.pdf

    15章 使用Canvas绘图 略 16章 HTML5脚本编程 HTML5规范了新的HTML标记和JavaScript API,以便简化创建动态Web界面的工作 跨文档消息传递 简称XDM,指来自不同域 ...

  7. JavaScript高级程序设计57.pdf

    表单序列化 首先了解一下浏览器如何将数据发送给服务器 对表单字段的名称和值进行URL编码,使用和号(&)分隔 不发送禁用的表单字段 只发送勾选的复选框和单选按钮 不发送type为“reset” ...

  8. JavaScript高级程序设计55.pdf

    输入模式 HTML5为文本字段新增了pattern属性,这个属性的值是一个正则表达式,用于匹配文本框中的值 例如,只想在允许在文本字段中输入数值 <input type="text&q ...

  9. JavaScript高级程序设计54.pdf

    过滤输入 对于一些浏览器,可以使用正则表达式里的text()测试用户按下的按键,Firefox和safari(3.1版本之前)会对向上向下.退格键和删除键触发keypress事件,在Firefox中, ...

随机推荐

  1. python基础知识二

    对象 python把在程序中用到的任何东西都成为对象. 每一个东西包括数.字符串甚至函数都是对象. 使用变量时只需要给他们赋一个值.不需要声明或定义数据类型. 逻辑行与物理行 物理行是你在编写程序时所 ...

  2. [转载]Oracle基础知识

    一.oracle安装过程略 二.sys用户和system用户 (1)sys用户是超级用户,具有最高权限,具有sysdba角色,有create database的权限 默认密码是change_onins ...

  3. c# ADO连接Access 执行Open后程序自动退出

    今天利用ADO连接Access数据库的时候遇到了前所未见的问题,Access数据库连接串,OleDbConnection,open的时候,系统就会自动关闭所有调试. 我就很纠结了,这个AccessHe ...

  4. CSS 导航栏

    实例: 导航栏 Home News Articles Forum Contact About 导航栏 熟练使用导航栏,对于任何网站都非常重要. 使用CSS你可以转换成好看的导航栏而不是枯燥的HTML菜 ...

  5. LINQ 101——约束、投影、排序

    什么是LINQ:LINQ 是一组 .NET Framework 扩展模块集合,内含语言集成查询.集合以及转换操作.它使用查询的本机语言语法来扩展 C# 和 Visual Basic,并提供利用这些功能 ...

  6. ACM HDU 2674 N! Again(数论)

    继续数论.. Problem Description WhereIsHeroFrom:            Zty,what are you doing ? Zty:                 ...

  7. PHP设计模式之:外观模式

    外观模式: 外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用: 外观模式又称为门面模 ...

  8. Java 不定长度参数

    在调用某个方法时,若是方法的参数个数事先无法确定该如何处理?例如System.out.printf()方法中并没有办法事先决定要给的参数个数,像是: ? 1 2 3 System.out.printf ...

  9. php基础知识【函数】(1)数组array

    一.排序 1.sort -- 从最低到最高排序,删除原有的键名,赋予新的键名[字母比数字高] 2.rsort -- 逆向排序(最高到最低),删除原有的键名,赋予新的键名[字母比数字高] 3.asort ...

  10. python 包导入规则

    python 包导入规则,恶心了一天,终于搞清楚了 1.目录 speed data __init__.py __init__.py static templates view __init__.py ...