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. 动态原型模式 ...
随机推荐
- 数组求最大最小值和排序java实现
public class ArrayDemo05 { public static void main(String[] args) { int list01[]={67,89,87,69,90 ...
- hdu 4162 Shape Number 最小表示法
题目链接 给一个字符串, 将它想象成一个环, 然后从环中任意一个位置断开, 求断开后字典序最小的那种情况. 直接上模板.. #include <iostream> #include < ...
- 认识和理解css布局中的BFC
认识和理解css布局中的BFC BFC的定义 是 W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用. Block Formatting Con ...
- 淘宝数据库连接池 druid 性能评测
想必大家知道淘宝在双十一惊人表现,搜索群里有哥们对淘宝的链接池进行了测试,废话不多说,直接上测试结果,结果如下:在Spring中使用方法<bean id="dataSource&quo ...
- Html 小插件9 腾讯新闻
地址:http://minisite.qq.com/others08/ 效果:
- Android Animation学习(一) Property Animation介绍
Android Animation Android framework提供了两种动画系统: property animation (introduced in Android 3.0)和view an ...
- linux之screen命令
linux平台下想同时运行多个操作,执行多个程序或命令:命令行就一个,要想同时执行多个命令如何操作? 一个screen命令即可: Centos操作系统默认没有安装screen: 安装方法: Cento ...
- SQL数据库关键字和列名冲突处理
在设计SQL数据库的时候可能由于考虑不全,使列名和数据库内关键字冲突,可能导致Query不能被正确识别,对列名要加[]处理.
- iOS NSMutableURLRequest 上传图片
- (void)postImage:(UIImage *)_image { //分界线的标识符 NSString *TWITTERFON_FORM_BOUNDARY = @"AaB03x&q ...
- 各种输入速度比较(cin,scanf,getchar,pascal的read)
每个程序都是纯读入与1个输出.输入数据分别有1e2,1e3,1e4,1e5,1e6,1e7个数. C++使用getchar()读入是最快的.流输入是非常非常慢! 比赛还是用gechar比较好...