一.创建对象

  • 工厂模式。使用简单的函数创建对象,为对象添加属性和方法,然后返回对象。【问题:没有解决对象识别问题】
  •  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:面向对象的程序设计的更多相关文章

  1. javaScript高级程序设计第3版笔记

    <script src = "xxx.js" defer = "defer"> </script> 在引用外部script时,<s ...

  2. Javascript高级程序设计第三版-笔记

    1.JS数值最大值最小值: >Number.MIN_VALUE <5e-324 >Number.MAX_VALUE <1.7976931348623157e+308 判断数值是 ...

  3. 《JavaScript高级程序设计》笔记:面向对象的程序设计(六)

    面向对象的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象. 理解对象 创建自定义对象的最简单的方法就是创建一个Object的实例,然后再为它添加属性和方法.例 ...

  4. javascript 高级程序设计学习笔记(面向对象的程序设计) 1

    Object构造函数或对象字面量都可以用来创建对象,但这些方式有个明显的缺点:使用相同一个接口创建很多对象,会产生大量重复代码. 工厂模式 //工厂模式 function createDog (nam ...

  5. javascript 高级程序设计学习笔记(面向对象的程序设计)继承

    ECMAScript中描述了原型链的概念,原型链是实现继承的主要方法. 实现原型链继承有一种基本模式 function SuperType () { this.property = true; } S ...

  6. javascript 高级程序设计学习笔记(面向对象的程序设计) 2

    在调用构造函数时会为实例添加一个指向最初原型的指针,我们可以随时为原型添加属性和方法,并且能在实例中体现出来,但如果是重新了原型对象,那就会切断构造函数与最初原型的联系. function Dog ( ...

  7. 精读《javascript高级程序设计》笔记三——面向对象的程序设计

    重点来了,我认为这一章值得好好地反复地看.看第一遍 还是懵懵懂懂,现在看第二遍,终于能看出点意思了. 创建对象 工厂模式 function createPerson(name, age, job){ ...

  8. 《JAVASCRIPT 高级程序设计》读书笔记六 面向对象的程序设计

    一   对象属性 a.对象定义: 无序属性的集合,其属性可以包含基本值.对象或者函数: b.两种创建方式: 1.构造函数: var person = new Object(); person.name ...

  9. js高级教程第3版笔记(我的理解)陆续更新中

    js基础语法'use strict'(严格模式)定义变量var object;只声明未赋值,默认值为undefined;var object1=值;声明并赋值;function fun(a){这样也叫 ...

  10. 《JavaScript高级程序设计》第六章【面向对象的程序设计】 包括对象、创建对象、继承

    一.理解对象 二.创建对象      1. 工厂模式      2. 构造函数模式      3. 原型模式      4. 组合使用构造函数模式和原型模式[使用最广泛]      5. 动态原型模式 ...

随机推荐

  1. Cookie已经过时,细看Facebook, Google, Apple如何追踪用户

    http://www.infoq.com/cn/news/2014/10/cookie-facebook-google-apple 链接地址 Cookie,有时也用其复数形式Cookies,指某些网站 ...

  2. hdu 2295 Radar 重复覆盖+二分

    题目链接 给m个雷达, n个城市, 以及每个城市的坐标, m个雷达里只能使用k个, 在k个雷达包围所有城市的前提下, 求最小半径. 先求出每个雷达到所有城市的距离, 然后二分半径, 如果距离小于二分的 ...

  3. js中this的四种使用方法

    0x00:js中this的四种调用模式 1,方法调用模式 2,函数调用模式 3,构造器调用模式 4,apply.call.bind调用模式 0x01:第一种:方法调用模式 (也就是用.调用的)this ...

  4. ny 58 最少步数 (BFS)

    题目:http://acm.nyist.net/JudgeOnline/problem.php?pid=58 就是一道简单的BFS 练习练习搜索,一次AC #include <iostream& ...

  5. 在实体对象中访问导航属性里的属性值出现异常“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 ...

  6. 如何取消一个本地svn目录与svn的联系(即恢复原有图标等)

    在使用svn 的时候容易手抖错选update地址,使其目录所有同级文件夹上出现蓝色“?”图样,非常烦人,下面记录一下解决方案. 首先在该目录下打开同级文件件,工具→文件夹选项→查看→隐藏文件和文件夹→ ...

  7. //Build/ 2014 开发者大会Azure重点整理

     寓教于乐,轻松掌握 Windows Apps和 Cloud //Build/ 2014开发者大会第二天重点整理 (上) //Build/ 2014开发者大会第二天的主题演讲主要包含两部分:Mic ...

  8. HDU 5765 Bonds(状压DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5765 [题目大意] 给出一张图,求每条边在所有边割集中出现的次数. [题解] 利用状压DP,计算不 ...

  9. HDU 5769 Substring(后缀数组)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5769 [题目大意] 在一个串中求出包含字母的子串个数, 只要存在一个字符不相等的子串即可视为不同的 ...

  10. js导出成excel

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...