JavaScript高级程序设计-读书笔记(2)
第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)的更多相关文章
- javascript高级程序设计读书笔记-事件(一)
读书笔记,写的很乱 事件处理程序 事件处理程序分为三种: 1.html事件2. DOM0级,3,DOM2级别 没有DOM1 同样的事件 DOM0会顶掉html事件 因为他们都是属性 而 ...
- javascript高级程序设计读书笔记
第2章 在html中使用javascript 一般都会把js引用文件放在</body>前面,而不是放在<head>里, 目的是最后读取js文件以提高网页载入速度. 引用js文 ...
- Javascript高级程序设计读书笔记(第六章)
第6章 面向对象的程序设计 6.2 创建对象 创建某个类的实例,必须使用new操作符调用构造函数会经历以下四个步骤: 创建一个新对象: 将构造函数的作用域赋给新对象: 执行构造函数中的代码: 返回新 ...
- JavaScript高级程序设计-读书笔记(7)
第22章 高级技巧 1.高级函数 (1)安全的类型检测 在任何值上调用Object原生的toString()方法,都会返回一个[object NativeConstructorName]格式的字符串. ...
- JavaScript高级程序设计 读书笔记
第一章 JavaScript 简介 第二章 Html中使用JavaScript 第三章 基本概念 第四章 变量,作用域,内存 第五章 引用类型 第六章 面向对象 第七章 函数表达式 第八章 BOM 第 ...
- JavaScript高级程序设计 读书笔记 第一章
JavaScript是一种专门为与网页交互而设计的脚本语言 JavaScript实现 ECMAscript---核心 DOM---文档对象模型 BOM---浏览器对象模型
- Javascript高级程序设计读书笔记(第二章)
第二章 在HTML中使用Javascript 2.1<script>元素 延迟脚本(defer = "defer")表明脚本在执行时不会影响页面的构造,脚本会被延迟到 ...
- JavaScript高级程序设计-读书笔记(6)
第20章 JSON JSON是一个轻量级的数据格式,可以简化表示复杂数据结构的工作量 JSON的语法可以表示一下三种类型的值 l 简单值:使用与JavaScript相同的语法,可以在JS ...
- JavaScript高级程序设计-读书笔记(5)
第13章 事件 1.事件流 事件流描述的是从页面中接收事件的顺序.IE的事件流是事件冒泡流,而Netscape Communicator的事件流是事件捕获流. (1)事件冒泡,即事件开始时由最具体的元 ...
- JavaScript高级程序设计-读书笔记(4)
第11章 DOM扩展 1.选择符API Selector API Level 1 的核心是两个方法:querySelector()和querySelectorAll().在兼容的浏览器中,可以通过Do ...
随机推荐
- GCJ 2015R2(Bilingual-最小割)
Problem C. Bilingual Problem Elliot's parents speak French and English to him at home. He has heard ...
- DotNet Core全新认识
一.概述 .NET 经历14年,在Windows平台上的表现已经相当优秀,但是“跨平台.开源”却是其痛点,从16年开始.NET Core的出现将迎来.NET的真正意义上的跨平台和开源序幕. ...
- LoadJS
LoadJS是一个微小的异步加载器为现代浏览器(711字节). https://github.com/muicss/loadjs 介绍 LoadJS是一个微小的异步加载库的现代浏览器(IE9 +). ...
- JS中将字符串中每个单词的首字母大写化
今天看到一个帖子,处理js中字符串每个单词的首字母大写. 原贴地址:关于字符串中每个单词的首字母大写化问题 受到启发,自己跟着改写了几个版本如下,请大家指正. 1.for循环: var a = 'Hi ...
- PHP面试专用笔记精简版
[PHP笔记] 1.require 遇到即包含文件,require_once 只包含一次.require 遇到错误会终止,一般放在程序的最前面:include遇到错误会继续执行,一般放在流程控制语句中 ...
- Linux kernel AESNI缓冲区溢出漏洞
解决办法: CENT OS:升级系统内核. yum update kernel UBUNTU:升级系统内核. #到 Ubuntu网站http://kernel.ubuntu.com/~kernel-p ...
- oracle dataguard参数
在整个dg配置中,最复杂的也许就是参数的配置了,并且有许多参数都可以延伸出去讲很多,所以今天我们来看看dg的参数配置,顺便加上一点dataguard进程相关的信息,帮助理解. 在配置dg的过程中,我们 ...
- 11g ASM新特性
Oracle 11g的ASM有两个有意思的特性,我们看看他们能带给我们什么? 1.Fast mirror resync 原来当diskgroup中的盘发生故障时,Oracle会将这个盘标记为offli ...
- gdb core
程序运行发生异常退出,比如segment错误,此时可以利用系统生成的core文件,配合GDB来定位问题. 问题程序: segment.c #include <stdio.h> #inclu ...
- Web UI 自动化单个xpath抓取插件详解
原文地址http://blog.csdn.net/kaka1121/article/details/51878346 单个控件获取 需求: 右键到某个控件上,就能获取到至多三个可以唯一定位该元素的相对 ...