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;

更多相关文章
  • 注册处理程序 navigator.registerContentHandler("applicat/rss+xml","http://www.somereader.com?feed=&s","Some Reader"); scree ...
  • Number是数字值对应的引用类型 var numberObject=new Number(10); Number也重写了valueof().toLocaleString().和toString()方法,valueOf()方法返回对象表示的基本类型数值,另外两个方法则返回字符串形式的数值,除了继承的 ...
  • JavaScript高级程序设计(第2版) 笔记1
    JavaScript高级程序设计这本书以前一个朋友推荐我看,可惜因为种种原因,都没有系统地拜读全书.最近一段时间刚好有这个时间,也就再次捧起,有一段时间没有阅读技术类的书籍,读起来感觉有点乏味了...... 而说到JavaScript确实一门不错的语言(注:PHP的不要喷我!),不过我相信很多人都同 ...
  •   JavaScript学习12 JS中定义对象的几种方式   JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工厂方式 3.构造函数方式 4.原型(“prototype”)方式 5.动态原型方式   一.
  • JavaScript對比12 款優秀的JavaScript MVC/MVVC框架 你最喜歡Backbone or Ember
    http://codebrief.com/2012/01/the-top-10-javascript-mvc-frameworks-reviewed/ 目前基本所以后台程序都是面向对象MVC模式开发,作为Web前端开发的人来说,也是很需要的,那么目前有没有可以借鉴的呢?作者(Gordon L.Hem
  • JavaScript高级编程II
         原文地址: http://www.onlamp.com/pub/a/onlamp/2007/08/23/advanced-javascript-ii.html?page=1        在前面的文章中,我们介绍了两类JavaScript小工具及其源代码:浮动文本和弹出菜单.本文中,我们将 ...
  • JavaScript Patterns 2.12 Writing API Docs
    Free and open source tools for doc generation
  • 一:HTML4.01为<script>标签定义了6个属性: async: 表示应该立即下载脚本,但不应该妨礙页面中其他操作——————只对外部脚本有效: charset: 表示通过src属性指定的代码的字符集—————————————很少用: defer: 表示脚本可以延迟到文档完全被解 ...
一周排行