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

创建对象

1.最简单方式创建Object的实例,如

var person = new Object();

person.name = “Greg”;

person.age = 27;

person.job = ”Doctor”;

person.sayName = function() {

alert(this.name);

};

person. sayName();

缺点:会产生大量重复代码

2.工厂模式:用函数来封装以特定接口创建对象的细节,如

function createPerson(name,age,job){

var o = new Object();

o.name = name;

o.age = age;

o.job = job;

o.sayName = function() {

alert(this.name);

};

}

var person1 = createPerson(“Greg”,27,”Doctor”);

person1. sayName;  //” Greg”

虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即怎样知道一个对象的类型)。

3.构造函数模式

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”,27,”Doctor”);

person1. sayName();  //” Greg”

注:按照惯例,构造函数始终应该以一个大写字母开头,而非构造函数则应该以一个小写字母开头。

使用构造函数的主要问题,就是每个方法都要在每个实例上重新创建一遍。

4.原型模型

我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个对象,它的用途是包含可以由特定类型的所有实例共享的属性和方法。

function Person(name,age,job){

}

Person. prototype.name = “Greg”;

Person. prototype.age = 27;

Person. prototype.job =”Doctor”;

Person. prototype.sayName = function() {

alert(this.name);

};

var person1 = new Person();

var person2 = new Person();

person1.sayName();  // “Greg”

person2.name = “Nicholas”;

alert(“person1.name”);  //“Greg”——来自原型

alert(“person2.name”);   //“Nicholas”——来自实例

当调用构造函数创建一个新实例后,该实例的内部将包含一个指针(内部属性),指向构造函数的原型属性。

当为对象实例添加一个属性时,这个属性就会屏蔽原型对象中保存的同名属性;换句话说,添加这个属性只会阻止我们访问原型中的属性,但不会修改那个属性。不顾,可以使用delete操作符删除实例属性。

delete person2.name;

alert(“person2.name”);   //“Greg”——来自原型

使用hasOwnProperty()方法可以检测一个属性是存在于实例中,还是存在于原型中。

person2.name = “Nicholas”;

alert(“person2.name”);  //“Greg”——来自实例

alert(person1. hasOwnProperty(“name”));   //true

有两种方式使用in操作符:单独使用和在for-in循环中使用。在单独使用时,in操作符会在通过对象能够访问给定属性时返回true,无论该属性存在于实例中还是原型中。

alert(”name” in person1);   //true

原型对象的问题:对于包含引用类型值的属性来说,原型的共享本性将导致一些问题。

5.组合使用构造函数模式和原型模式(创建自定义类型最常见方式)

function Person(name,age,job){

this.name = name;

this.age = age;

this.job = job;

this.friend = [“Shelby”,”Court”];

};

Person. prototype = {

constructor : Person,

sayName : function() {

alert(this.name);

}

}

var person1 = new Person(“Nicholas”,29,”Engineer”);

var person2 = new Person(“Greg”,27,”Doctor”);

person1.friend.push(“Van”);

alert(person1.friend);    //” Shelby ,Court, Van”

alert(person2.friend);    //” Shelby ,Court”

alert(person1.friend === person2.friend);   //false

alert(person1.SayName === person2.SayName);   //true

是目前在ECMAScript中使用最广泛、认同度最高的一种创建自定义类型的方法。

6.寄生构造类型函数模式(上述几种模式都不适用的情况下使用)

function Person(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 person = new Person(“Greg”,27,”Doctor”);

person1. sayName();  //” Greg”

返回的对象与构造函数或者构造函数的原型属性之间没有关系。所以,建议在可以使用其他模式的情况下,不使用这种模式。

7.稳妥构造函数模式

function Person(name,age,job){

//创建要返回的对象

var o = new Object();

//可以在这里定义私有变量和函数

//添加方法

o.sayName = function() {

alert(name);

};

//返回对象

return o;

}

最适合在一些安全的环境中(这些环境中会禁止使用this和new),或者防止数据被其他应用程序改动时使用。

继承

由于函数没有签名,在ECMAScript中无法实现接口继承。ECMAScript只支持实现继承,而且其实现继承主要依靠原型链来实现的。

原型链的基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。

使用最多的继承模式是组合继承,这种模式使用原型链来继承共享属性和方法,而通过借用构造函数继承实例属性。

第7章 匿名函数

匿名函数就是没有名字的函数。任何函数表达式从技术上说都是匿名函数。

闭包是指有权访问另一个函数作用域的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。由于闭包会包含它的函数的作用域,因此会比其他函数占用更多的内存,建议只在绝对必要时再考虑使用闭包。

this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。不过,匿名函数的执行环境具有全局性,因此其this对象通常指向window。

任何在函数中定义的变量,都可以认为是私有变量,因为不能在函数的外部访问这些变量。

我们把有权访问私有变量和私有函数的共有方法称为特权方法。有两种在对象上创建特权方法的方式:

第一种是在构造函数中定义特权的方法;

第二种是使用静态私有变量来实现特权方法。

另外,可以使用模块模式、增强的模块模式来实现单例的特权方法。

JavaScript高级程序设计-读书笔记(2)的更多相关文章

  1. javascript高级程序设计读书笔记-事件(一)

    读书笔记,写的很乱   事件处理程序   事件处理程序分为三种: 1.html事件2. DOM0级,3,DOM2级别  没有DOM1 同样的事件 DOM0会顶掉html事件   因为他们都是属性  而 ...

  2. javascript高级程序设计读书笔记

    第2章  在html中使用javascript 一般都会把js引用文件放在</body>前面,而不是放在<head>里, 目的是最后读取js文件以提高网页载入速度. 引用js文 ...

  3. Javascript高级程序设计读书笔记(第六章)

    第6章  面向对象的程序设计 6.2 创建对象 创建某个类的实例,必须使用new操作符调用构造函数会经历以下四个步骤: 创建一个新对象: 将构造函数的作用域赋给新对象: 执行构造函数中的代码: 返回新 ...

  4. JavaScript高级程序设计-读书笔记(7)

    第22章 高级技巧 1.高级函数 (1)安全的类型检测 在任何值上调用Object原生的toString()方法,都会返回一个[object NativeConstructorName]格式的字符串. ...

  5. JavaScript高级程序设计 读书笔记

    第一章 JavaScript 简介 第二章 Html中使用JavaScript 第三章 基本概念 第四章 变量,作用域,内存 第五章 引用类型 第六章 面向对象 第七章 函数表达式 第八章 BOM 第 ...

  6. JavaScript高级程序设计 读书笔记 第一章

    JavaScript是一种专门为与网页交互而设计的脚本语言 JavaScript实现 ECMAscript---核心 DOM---文档对象模型 BOM---浏览器对象模型

  7. Javascript高级程序设计读书笔记(第二章)

    第二章  在HTML中使用Javascript 2.1<script>元素 延迟脚本(defer = "defer")表明脚本在执行时不会影响页面的构造,脚本会被延迟到 ...

  8. JavaScript高级程序设计-读书笔记(6)

    第20章 JSON JSON是一个轻量级的数据格式,可以简化表示复杂数据结构的工作量 JSON的语法可以表示一下三种类型的值 l        简单值:使用与JavaScript相同的语法,可以在JS ...

  9. JavaScript高级程序设计-读书笔记(5)

    第13章 事件 1.事件流 事件流描述的是从页面中接收事件的顺序.IE的事件流是事件冒泡流,而Netscape Communicator的事件流是事件捕获流. (1)事件冒泡,即事件开始时由最具体的元 ...

  10. JavaScript高级程序设计-读书笔记(4)

    第11章 DOM扩展 1.选择符API Selector API Level 1 的核心是两个方法:querySelector()和querySelectorAll().在兼容的浏览器中,可以通过Do ...

随机推荐

  1. Ubuntu 12.04安装Google Chrome(转)

    下载google chrome deb包,下载地址:https://www.google.com/chrome/browser/desktop/index.html,google的网站被墙了,如果你下 ...

  2. 一条SQL引起的雪崩

    1.问题描述 MySQL服务器卡死,CPU飚到300%多,命令执行缓慢. 2.问题定位 踩了狗屎运,直接找到了问题缘由 发现了一条SQL写的模糊匹配,将%写在了关键字的前面,这样会造成查询不使用索引, ...

  3. Python面试应急5分钟!

    ​ 不论你是初入江湖,还是江湖老手,只要你想给自己一个定位那就少不了面试!面试的重要性相信大家都知道把,这就是我们常说的“第一印象”,给大家说一下我的面试心得把,面试前的紧张是要的,因为这能让你充分准 ...

  4. 配置stun服务器实现穿墙

    Turn服务器的配置流程 Webrtc是基于P2P的,在两个客户端建立连接之前需要服务器建立连接,这时两台设备一般都处于一个或者多个NAT中,那么两台设备建立连接就需要穿墙技术. 这时就用到了turn ...

  5. django 模板语言之 filter 自定义模板

    可以自己写python函数放在模板语言里用 这种方法是django里面的 filter {{ item.event_start|date:"Y-m-d H:i:s"}} {{ bi ...

  6. jQery实现插入删除信息

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  7. quick-cocos2d-x + Lua 开发

    quick-cocos2d-x + Lua 开发      quick-cocos2d-x + Lua 开发 首页在Eclipse中搭建quick-cocos2d-x的lua开发环境. 1. 首先需要 ...

  8. Jenkins--持续集成服务器

    1.持续集成: 1.1概念 持续集成,Continuous integration ,简称CI. 集成:我们所有项目的代码都是托管在SVN服务器上.每个项目都要有若干个单元测试,并有一个所谓集成测试. ...

  9. 性能调优之MySQL篇一:MySQL性能计数器

    计数器 计数器分析 Threads_connected 表示当前有多少个客户连接该mysql服务器,连接数是否过多,网络是否存在问题,它是动态变化的,当达到最大连接数时,数据库系统就不能提供更多的连接 ...

  10. Scala快速排序

    Scala 快排 Scala 基本思想:经过一趟排序,把待排对象分成两个独立的部分,一部分的数据大(小)于另一部分,同理,对子对象进行如此处理,以达到所有数据都有序.   package studen ...