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. 动态原型模式 ...
随机推荐
- Mysql数据库中的EXISTS和NOT EXISTS
SQL语言中没有蕴含逻辑运算.但是,可以利用谓词演算将一个逻辑蕴含的谓词等价转换为:p->q ≡┐p∨q. 我们通过一个具体的题目来分析:(具体的表和数据详见文章:Mysql数据库中的EXIST ...
- Mysql 权限修改何时生效
首先权限是记录在表中的,所以如果我们要修改权限只要修改表中的数据就可以了! 方法 1 grant ,revoke,set password,rename user .......等等 2 insert ...
- 设置cmd的codepage的方法
设置cmd的codepage的方法 有时候,我们的cmd.exe的codepage和字体等会变化,比如突然由中文变成英文的codepage(因为一些sh程序的干扰). 下面是修正方法: [HKEY_C ...
- ubuntu 常用生产环境部署配置测试调优
1,ubuntu monogdb 安装配置 2,ubuntu jdk1.7,tomcat7安装 3,ubuntu LAMP部署 4,mongodb 远程热备份及恢复 使用自带的mongodump和mo ...
- UVA1291----Dance Dance Revolution----3维DP
本文出自:http://blog.csdn.net/dr5459 题目地址: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&a ...
- SGU 200 Cracking RSA (高斯消元)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 题意:给出m个整理,因子全部为前t个素数.问有多少 ...
- 假设给Contact的List加一个用字母排序的导航
效果图: 这样写Layout: <? xml version="1.0" encoding="utf-8"? > <LinearLayout ...
- 取文件的大小 (KB,MB,GB...)
取文件的大小 (KB,MB,GB...) 2种方式: VB 和 C# 1, VB Public Function GetFileSize(ByVal iFileSizeKB As Long) As ...
- Android基础之在Eclipes中关联SDK源码和查看SDK源码
在进行Android应用开发的时候,我们有时候需要查看某个类或接口的源码从而了解如何去使用一个类或者实现一个接口,查看源码有助于我们的学习某个封装的类的底层是如何实现的,这样可以帮助我们掌握类或者接口 ...
- 一步一步学c#(五):泛型
泛型 性能 泛型的一个重要的优点是性能.system.collections和system.collections.generic名称空间的泛型和非泛型集和类.对值类型使用非泛型集合类,在把值类型转换 ...