第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生成多位随机数方法

    Math.random()方法可以令系统随机选取大于等于0.0且小于1.0的伪随机double值 利用函数Math.random()即可生成若干位随机数 以下是生成十位随机数代码: public st ...

  2. 记录:tensoflow改错TypeError: Cannot interpret feed_dict key as Tensor: Can not convert a float into a Te

    错误描述: TypeError: Cannot interpret feed_dict key as Tensor: Can not convert a float into a Tensor. 改错 ...

  3. 设备驱动与控制器 I/O

    控制器是对硬件发起控制命令,负责给系统提供接口,想要正常使用该硬件功能系统中必须安装相应驱动 I/O设备 cpu和存储器并不是操作系统唯一需要管理的资源,I/O设备也是非常重要的一环. I/O设备一般 ...

  4. python全栈开发从入门到放弃之socket并发编程之协程

    一.为什么会有协程 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情 ...

  5. ActiveRecord多数据库配置

    ActiveRecord 的多数据库配置基本沿袭了 NHibernate 的思想,只不过在配置文件结构上作了些调整.NHibernate的配置也是基于配置得来的,配置多个SessionFactory传 ...

  6. java模拟http/https post请求

    1.Post请求失败的代码 try { HttpResponse response = httpClient.execute(httpPost); HttpEntity entity = respon ...

  7. Zookeeper那些事

    一. 什么是Zookeeper Zookeeper 是 Google 的 Chubby一个开源的实现,是 Hadoop 的分布式协调服务 它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务, ...

  8. server2003 IIS 错误 解决

    网页无法打开总显示: 无法找到该页您正在搜索的页面可能已经删除.更名或暂时不可用. ---------------------------------------------------------- ...

  9. docker swarm overlay stack 服务部署记录

    项目xxx(后端),xxx-ui前端(前后端分离的项目) 依赖mysql,elasticsearch.分别制作了四个镜像来做这件事.希望可以制作跨主机的部署,使用了swarm,以下是学习记录. 参考 ...

  10. Python的进程、线程和threading模块

    (注:本文部分内容摘自互联网,由于作者水平有限,不足之处,还望留言指正.) 怀念在学校念书的时候,我不小心触碰到了错误,老师会说:你错了:而我却总是倔强得以为自己没错.我的内心是不屑的,直到在真理面前 ...