第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. Sublime Text 中文

    1.打开Sublime Text 2.Ctrl+Shift+P,输入Package Control: Install Package回车 3.输入LocalizedMenu,回车 4.点击菜单help ...

  2. Web爬虫的C#请求发送

    public class HttpControler { //post请求发送 private Encoding m_Encoding = Encoding.GetEncoding("gb2 ...

  3. C#线程池ThreadPool

    线程池可以看做容纳线程的容器: 一个应用程序最多只能有一个线程池: 设置线程数量ThreadPool.SetMaxThreads(initDownCardThreadPool, maxDownCard ...

  4. Git添加本地项目出现fatal: unable to get credential storage lock: File exists

    把本地项目初始化之后上传到github上出现问题:fatal: unable to get credential storage lock: File exists 解决办法:是因为我上传用的git帐 ...

  5. 生信-序列比较dp[未完成]

    来自:生物信息学-陈铭第二版的一个例题. 题目: 目前的代码,运行不正确,关键就是不知道怎么回溯啊,回溯怎么标记呢? #include <iostream> #include<vec ...

  6. [golang note] 变量常量

    变量 • 变量声明 √ golang变量声明的关键字为var. √ golang变量声明时类型信息放置在变量名之后. ▶ 单个变量声明 ▪ 语法如下 var name type ▪ 示例如下 var ...

  7. The Cheap KD 10 is my best shoe yet

    10 years of anything is fairly huge Cheap KD 10, but adding something as great as Flyknit causes it ...

  8. 62. Unique Paths (走棋盘多少种不同的走法 动态规划)

    A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...

  9. [转]loadrunner:系统的平均并发用户数和并发数峰值如何估算

    一.经典公式1: 一般来说,利用以下经验公式进行估算系统的平均并发用户数和峰值数据 1)平均并发用户数为 C = nL/T 2)并发用户数峰值 C‘ = C + 3*根号C C是平均并发用户数,n是l ...

  10. windows下Qt5.4.2 for android开发环境配置

    安装包链接: http://yunpan.cn/cFs5tikVA83hK 访问密码 d029   本人所有的软件都安装在D:/Qt   1. 安装 Qt 5.4.2      不在讲述 2, 安装p ...