一.创建对象

  • 工厂模式。使用简单的函数创建对象,为对象添加属性和方法,然后返回对象。【问题:没有解决对象识别问题】
  •  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. 公选网站作业4_2.php

    序:   此实验的功能是只有已经登陆或者已经注册的用户才有发表留言的资格,否则只能够浏览留言. 1.  主要文件: 4_2login.html// 登陆的主页面 4_2login.php  //处理登 ...

  2. idea修改文件名后出现main method should be static错误

    1.确保你有main方法 2.别忘了main方法里还有参数: String[] args

  3. 在Ubuntu 11.10工具栏上用数字显示网速、CPU负荷和内存占用量『译』

    基本上照抄了<How To Display Network Upload / Download Speed On The Panel In Ubuntu 11.04>,只不过我的实践环境是 ...

  4. mysql 函数执行权限

    mysql> show grants for query_all@'115.236.1x0.x'; +---------------------------------------------- ...

  5. (92) Web Crawling: How can I build a web crawler from scratch? - Quora

    (92) Web Crawling: How can I build a web crawler from scratch? - Quora How can I build a web crawler ...

  6. andrewchilds/jQuery.DomOutline

    andrewchilds/jQuery.DomOutline DOM - 使用Javascript:让用户选择一个类似Firebug的HTML元素? -

  7. wordpress在window下完美实现301重定向的方法

    问题: 首先,简单说一下关于301重定向的问题,最简单的理解就是,假设你的主机上绑定有 www.uilike.cn, uilike.cn, www.uiseo.cn三个域名,当你想输入 uilike. ...

  8. java 执行bat文件 并输出信息

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i ...

  9. stl非变易算法(二)

    这里接着上篇stl非变易算法(一)进行总结.主要解析算法函数count.count_if.mismatch.equal.search.search_n以及find_end.给出算法函数的实现及測试用例 ...

  10. Git怎样同一时候删除多个仓下的同一个分支

    每次下载完代码我们都会在本地通过repo start my_local --all建立分支,这样我们下载的代码在每一个仓下都有一个名叫my_local的分支,有些时候我们因为须要还会建立其它分支,当我 ...