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. 动态原型模式 ...
随机推荐
- JSP三大常用对象request、response、session
1.request对象 客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求, 然后做出响应.它是HttpServletRequest类的实例. 序号方法说明 objectgetA ...
- Asp MVC 中处理JSON 日期类型
注:时间有点忙,直接copy 过来的,要查看原址: http://www.developer.com/net/dealing-with-json-dates-in-asp.net-mvc.html I ...
- IOS 特定于设备的开发:检查设备接近度和电池状态
UIDevice类提供了一些API,使你能够跟踪设备的特征,包括电池的状态和接近度传感器.他们二者都以通知的形式提供更新,可以订阅他们,以便在有重要的更新时通知你的应用程序. 1>启动和禁用接近 ...
- 闪存主控IC的作用
闪存主要是由闪存芯片.主控芯片.晶振.PCB板等部件组成的.其中主控芯片相当于闪存的“灵魂”,它控制着闪存的工作.主控芯片也是处理单元,在里面写入的程序对整个电路做控制.主控IC是把flash跟hos ...
- css table 布局
使用CSS表格 CSS表格能够解决所有那些我们在使用绝对定位和浮动定位进行多列布局时所遇到的问题.例如,“display:table;”的CSS声明能够让一个HTML元素和它的子节点像table元素一 ...
- http://www.swoole.com/
Swoole:重新定义PHP PHP语言的高性能网络通信框架,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列,毫秒定时器, ...
- Codeforces Beta Round #97 (Div. 2)
A题求给出映射的反射,水题 #include <cstdio> int x,ans[105],n; int main(){ scanf("%d",&n); fo ...
- 高性能JSON库---FastJson(阿里巴巴)
1.FastJSON简单介绍 Fastjson是一个Java语言编写的高性能功能完好的JSON库. 它採用一种"假定有序高速匹配"的算法,把JSON Parse的性能提升到极致,是 ...
- 关于typedef之四种用途 和 两个陷进
typedef用来声明一个别名,typedef后面的语法,是一个声明.本来笔者以为这里不会产生什么误解的,但结果却出乎意料,产生误解的人 不在少数.罪魁祸首又是那些害人的教材.在这些教材中介绍type ...
- Nhibernate初入门基本配置(一)
文章出处:http://www.cnblogs.com/GoodHelper/archive/2011/02/14/nhiberante_01.html 一.NHibernate简介 什么是?NHib ...