第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. java爬取网页内容 简单例子(1)——使用正则表达式

    [本文介绍] 爬取别人网页上的内容,听上似乎很有趣的样子,只要几步,就可以获取到力所不能及的东西,例如呢?例如天气预报,总不能自己拿着仪器去测吧!当然,要获取天气预报还是用webService好.这里 ...

  2. 转Hibernate Annotation mappedBy注解理解

    在Annotation 中有这么一个@mappedBy 属性注解,相信有些同学还是对这个属性有些迷惑,上网找了些理解@mappedBy比较深刻的资料,下面贴出来供大家参考. http://xiaoru ...

  3. HDU3074: Multiply game(线段树单点更新,区间查询)

    题目: 传送门 题解:线段树模板题目. 对递归的题目始终理解不好,我的痛啊,在水的题目都要写很长时间. #include <iostream> #include <string.h& ...

  4. (转)MFC中Doc,View,MainFrmae,App各指针的互相获取

    App是应用域,所有的域中的东西都可以通过全局函数访问到它. MainFrame是主框架,也基本可以用全局函数访问到. MainFrame下是若干个ChildFrame,ChildFrame中若干个V ...

  5. python3 爬虫之Pyquery的使用方法

    安装 pip install pyquery 官方文档: https://pythonhosted.org/pyquery/ 初始化方式(四种) 1. 直接字符串 from pyquery impor ...

  6. python 之操作redis数据库(非关系型数据库,k-v)

    数据库: 1. 关系型数据库 表结构 2. 非关系型数据库 nosql (k - v 速度快),常用的时以下三种: memcache 存在内存里 redis 存在内存里 mangodb 数据还是存在磁 ...

  7. 聊一聊python的单例模式

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  8. tcp五层模型

    物理层由来:上面提到,孤立的计算机之间要想一起玩,就必须接入internet,言外之意就是计算机之间必须完成组网 物理层功能:主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字 ...

  9. Leetcode 235

    思路1:对于一棵二叉排序树 1.如果当前节点的值小于p,q的值,那么LCA一定在root的右边: 2.如果当前节点的值大于p,q的值,那么LCA一定在root的左边: 3.如果当前节点的值在p,q的值 ...

  10. CodeForces - 343C Read Time (二分+贪心)

    题意:有N个指针头,M个标记,用这N个针头扫描所有的标记,针头之间互不影响,求扫描完M个标记的最短时间 分析:二分搜答案,mid为时间限制,则只要所有的点在mid秒内被扫描到即可. 对于每个指针,若其 ...