JavaScript 高级程序设计(第3版)笔记——chapter6:面向对象的程序设计
一.创建对象
- 工厂模式。使用简单的函数创建对象,为对象添加属性和方法,然后返回对象。【问题:没有解决对象识别问题】
1 function createPerson(name, age) {
2 var o = new Object();
3 o.name = name;
4 o.age = age;
5 o.sayName = function() {
6 console.log(this.name);
7 }
8 return o;
9 }
10
11 var p1 = createPerson("p1", "10");
12 p1.sayName(); //p1
13 console.log(p1 instanceof Object); //true
14 console.log(p1 instanceof createPerson); //false- 构造函数模式。可以创建自定义引用类型,可以像创建内置对象实例一样使用new操作符。缺点:每个成员都无法得到复用。
1 function Person(name, age) {
2 this.name = name;
3 this.age = age;
4 this.sayName = function() {
5 console.log(this.name);
6 }
7 }
8 var p2 = new Person("p2", 11);
9 p2.sayName(); //p2
10 console.log(p2 instanceof Object); //true
11 console.log(p2 instanceof Person); //true- 原型模式。使用构造函数的prototype属性来指定那些应该共享的属性和方法。
1 function person(name) {
2 }
3 person.prototype.name = "person";
4 person.prototype.sayName = function() {
5 console.log(this.name);
6 }
7 var p3 = new person();
8 var p4 = new person();
9 p3.sayName();//person
10 console.log(p3.sayName == p4.sayName);//true- 组合使用构造函数模式和原型模式。使用构造函数定义实例属性,而使用原型定义共享的属性和方法。
1 function p(name) {
2 this.name = name;
3 }
4 p.prototype.sayName = function() {
5 console.log(this.name);
6 }
7 var p5 = new p("p5");
8 var p6 = new p("p6");
9 p5.sayName();//p5
10 p6.sayName(); //p6
11 console.log(p5 instanceof Object); //true
12 console.log(p5 instanceof p); //true
13 console.log(p5.constructor instanceof Function);//true
二.继承
- 通过原型链继承。
- 注意点1:使用字面量添加新方法会重写原型链。
function SuperType() {
this.property = true;
} SuperType.prototype.getSuperValue = function() {
return this.property;
} function SubType() {
this.subproperty = false;
} //继承了SuperType
SubType.prototype = new SuperType(); //使用字面量添加新方法,会导致上一行代码无效。因为这样重写了原型链
SubType.prototype = {
getSubValue : function() {
return this.property;
}, someOtherMethod : function() {
return false;
}
}; var instance = new SubType();
console.log(instance.getSuperValue()); //error
- 注意点二:包含引用类型值的原型属性会被所有实例共享。
function SuperType() {
this.colors = [1,2,3];
} function SubType() {
} SubType.prototype = new SuperType();
var instance1 = new SubType();
instance1.colors.push(4);
console.log(instance1.colors); //[ 1, 2, 3, 4 ] var instance2 = new SubType();
console.log(instance2.colors); //[ 1, 2, 3, 4 ]- 借用构造函数。在子类型构造函数的内部调用超类型构造函数。
function SuperType() {
this.colors = [1,2,3];
} function SubType() {
SuperType.call(this);
} SubType.prototype = new SuperType();
var instance1 = new SubType();
instance1.colors.push(4);
console.log(instance1.colors); //[ 1, 2, 3, 4 ] var instance2 = new SubType();
console.log(instance2.colors); //[ 1, 2, 3]
/*在新的SubType对象上执行SuperType()函数中定义的所有对象初始化代码。所以,SubType的每个实例就会具有自己的colors属性的副本了。*/- 组合继承。使用原型链实现对原型属性和方法的继承。而通过借用构造函数来实现对实例属性的继承。这样,即通过在原型上定义方法实现了函数复用,又能够保证每个实例都有它自己的属性。
function Super(name) {
this.name = name;
this.num = [1,2,3];
} Super.prototype.SayName = function() {
console.log(this.name);
}; function sub(name, age) {
//继承属性
Super.call(this, name);
this.age = age;
}
//继承方法
sub.prototype = new Super();
sub.prototype.constructor = sub;
sub.prototype.SayAge = function() {
console.log(this.age);
} var i1 = new sub("i1", 29);
i1.num.push(4);
console.log(i1.num);//[ 1, 2, 3, 4 ]
i1.SayAge(); //
i1.SayName(); //i1 var i2 = new sub("i2", 27);
console.log(i2.num); //[ 1, 2, 3]
i2.SayAge(); //
i2.SayName(); //i2
JavaScript 高级程序设计(第3版)笔记——chapter6:面向对象的程序设计的更多相关文章
- javaScript高级程序设计第3版笔记
<script src = "xxx.js" defer = "defer"> </script> 在引用外部script时,<s ...
- Javascript高级程序设计第三版-笔记
1.JS数值最大值最小值: >Number.MIN_VALUE <5e-324 >Number.MAX_VALUE <1.7976931348623157e+308 判断数值是 ...
- 《JavaScript高级程序设计》笔记:面向对象的程序设计(六)
面向对象的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象. 理解对象 创建自定义对象的最简单的方法就是创建一个Object的实例,然后再为它添加属性和方法.例 ...
- javascript 高级程序设计学习笔记(面向对象的程序设计) 1
Object构造函数或对象字面量都可以用来创建对象,但这些方式有个明显的缺点:使用相同一个接口创建很多对象,会产生大量重复代码. 工厂模式 //工厂模式 function createDog (nam ...
- javascript 高级程序设计学习笔记(面向对象的程序设计)继承
ECMAScript中描述了原型链的概念,原型链是实现继承的主要方法. 实现原型链继承有一种基本模式 function SuperType () { this.property = true; } S ...
- javascript 高级程序设计学习笔记(面向对象的程序设计) 2
在调用构造函数时会为实例添加一个指向最初原型的指针,我们可以随时为原型添加属性和方法,并且能在实例中体现出来,但如果是重新了原型对象,那就会切断构造函数与最初原型的联系. function Dog ( ...
- 精读《javascript高级程序设计》笔记三——面向对象的程序设计
重点来了,我认为这一章值得好好地反复地看.看第一遍 还是懵懵懂懂,现在看第二遍,终于能看出点意思了. 创建对象 工厂模式 function createPerson(name, age, job){ ...
- 《JAVASCRIPT 高级程序设计》读书笔记六 面向对象的程序设计
一 对象属性 a.对象定义: 无序属性的集合,其属性可以包含基本值.对象或者函数: b.两种创建方式: 1.构造函数: var person = new Object(); person.name ...
- js高级教程第3版笔记(我的理解)陆续更新中
js基础语法'use strict'(严格模式)定义变量var object;只声明未赋值,默认值为undefined;var object1=值;声明并赋值;function fun(a){这样也叫 ...
- 《JavaScript高级程序设计》第六章【面向对象的程序设计】 包括对象、创建对象、继承
一.理解对象 二.创建对象 1. 工厂模式 2. 构造函数模式 3. 原型模式 4. 组合使用构造函数模式和原型模式[使用最广泛] 5. 动态原型模式 ...
随机推荐
- Cookie已经过时,细看Facebook, Google, Apple如何追踪用户
http://www.infoq.com/cn/news/2014/10/cookie-facebook-google-apple 链接地址 Cookie,有时也用其复数形式Cookies,指某些网站 ...
- hdu 2295 Radar 重复覆盖+二分
题目链接 给m个雷达, n个城市, 以及每个城市的坐标, m个雷达里只能使用k个, 在k个雷达包围所有城市的前提下, 求最小半径. 先求出每个雷达到所有城市的距离, 然后二分半径, 如果距离小于二分的 ...
- js中this的四种使用方法
0x00:js中this的四种调用模式 1,方法调用模式 2,函数调用模式 3,构造器调用模式 4,apply.call.bind调用模式 0x01:第一种:方法调用模式 (也就是用.调用的)this ...
- ny 58 最少步数 (BFS)
题目:http://acm.nyist.net/JudgeOnline/problem.php?pid=58 就是一道简单的BFS 练习练习搜索,一次AC #include <iostream& ...
- 在实体对象中访问导航属性里的属性值出现异常“There is already an open DataReader associated with this Command which must be closed first”
在实体对象中访问导航属性里的属性值出现异常“There is already an open DataReader associated with this Command which must be ...
- 如何取消一个本地svn目录与svn的联系(即恢复原有图标等)
在使用svn 的时候容易手抖错选update地址,使其目录所有同级文件夹上出现蓝色“?”图样,非常烦人,下面记录一下解决方案. 首先在该目录下打开同级文件件,工具→文件夹选项→查看→隐藏文件和文件夹→ ...
- //Build/ 2014 开发者大会Azure重点整理
寓教于乐,轻松掌握 Windows Apps和 Cloud //Build/ 2014开发者大会第二天重点整理 (上) //Build/ 2014开发者大会第二天的主题演讲主要包含两部分:Mic ...
- HDU 5765 Bonds(状压DP)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5765 [题目大意] 给出一张图,求每条边在所有边割集中出现的次数. [题解] 利用状压DP,计算不 ...
- HDU 5769 Substring(后缀数组)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5769 [题目大意] 在一个串中求出包含字母的子串个数, 只要存在一个字符不相等的子串即可视为不同的 ...
- js导出成excel
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...