《javascript高级程序设计》读过有两遍了,有些重要内容总是会忘记,写一下读书笔记备忘

创建对象


工厂模式

工厂模式优点:有了封装的概念,解决了创建多个相似对象的问题

缺点:没有解决对象识别问题,所有对象都仅是Object的实例

  1. function createPerson(name,age,job)
  2. {
  3. var o=new Object();
  4. o.name=name;
  5. o.age=age;
  6. o.job=job;
  7. o.sayName=function(){
  8. alert(this.name);
  9. };
  10. return o;
  11. }
  12. var person1=createPerson("Jack",29,"Engineer");
  13.  
  14. //检测对象类型
  15. alert(person1 instanceof Object) //true
  16. alert(person1 instanceof Person) //error Person is not defined

构造函数模式

构造函数模式相比工厂模式的优点就在于,构造函数模式可以将他的实例标示为特定类型

  1. function Person(name,age,job)
  2. {
  3. this.name=name;
  4. this.age=age;
  5. this.job=job;
  6. this.sayName=function(){
  7. alert(this.name);
  8. };
  9. }
  10. var person1=new Person("Jack",29,"Engineer");
  11.  
  12. //检测对象类型
  13. alert(person1 instanceof Object) //true
  14. alert(person1 instanceof Person) //true

构造函数也是函数,如果不通过new 操作符调用,和其他函数没有不同

  1. function Person(name,age,job)
  2. {
  3. this.name=name;
  4. this.age=age;
  5. this.job=job;
  6. this.sayName=function(){
  7. alert(this.name);
  8. };
  9. }
  10. //以构造函数模式调用
  11. var person1=new Person("Jack",29,"Engineer");
  12. person1.sayName();//Jack
  13.  
  14. //以普通函数调用
  15. Person("Lily",25,"Actor");//执行环境为全局执行环节,this指向window
  16. window.sayName();//Lily
  17.  
  18. //在另一个对象的作用域中调用
  19. var o=new Object();
  20. Person.apply(o,["Jim",21,"Teacher"]);//扩展Person至实例对象o的作用域
  21. o.sayName();//Jim

构造函数模式缺点在于实例方法无法复用,创建两个对象person1,person2的sayName方法的不等的,解决方法可以将函数定义转至构造函数外部,构造函数这用函数指针作为对象属性,指向外部的函数定义。

但是这样的实现,首先污染了全局作用域,其次破坏了封装性

  1. function Person(name,age,job)
  2. {
  3. this.name=name;
  4. this.age=age;
  5. this.job=job;
  6. this.sayName=sayName;
  7. }
  8. function sayName(){
  9. alert(this.Name);
  10. }
  11. var person1=new Person("Karl",28,"Doctor");

原型模式

每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象,这个对象用途是包含可以由特定类型的所有实例共享的属性和方法

  1. function Person()
  2. {
  3. }
  4. Person.prototype.name="Jim";
  5. Person.prototype.age=29;
  6. Person.prototype.job="Teacher";
  7. Person.prototype.sayName=function(){
  8. alert(this.Name);
  9. };
  10. var person1=new Person();
  11. person1.sayName();//"Jim"
  12. var person2=new Person();
  13. alert(person1.sayName==person2.sayName);//true

代码这构造函数、原型对象和实例对象之间关系如下图

原型模式简易写法

  1. function Person()
  2. {
  3. }
  4. Person.prototype={
  5. constructor:Person,//对象字面量创建了新对象,如不指定,constructor指向了Object
  6. name:"Jim",
  7. age:29,
  8. job:"Teacher",
  9. sayName:function(){
  10. alert(this.name);
  11. }
  12. };

原型模式的缺点:所有实例在默认情况下取得相同属性值

构造器与原型混合模式

  1. function Person(name,age,job)
  2. {
  3. this.name=name;
  4. this.age=age;
  5. this.job=job;
  6. this.friends=["Tom","Jack"];
  7. }
  8. Person.prototype={
  9. constructor:Person,//对象字面量创建了新对象,如不指定,constructor指向了Object
  10. sayName:function(){
  11. alert(this.name);
  12. }
  13. };
  14.  
  15. var person1=new Person("Jim",25,"Teacher");
  16. var person2=new Person("Lily",20,"Actor");
  17. person1.friends.push("Mark");
  18. alert(person1.friends===person2.friends);//false
  19. alert(person1.sayName===person2.sayName);//true

动态原型模式

个人认为这一模式最优雅,所有代码封装在构造函数,首次调用将方法添加至原型对象

  1. function Person(name,age,job)
  2. {
  3. this.name=name;
  4. this.age=age;
  5. this.job=job;
  6. this.friends=["Tom","Jack"];
  7. //方法
  8. if(typeof this.sayName != "function")
  9. {
  10. Person.prototype.sayName=function(){
  11. alert(this.name);
  12. };
  13. }
  14. }

《Javascript高级程序设计》读书笔记之对象创建的更多相关文章

  1. javascript高级程序设计读书笔记

    第2章  在html中使用javascript 一般都会把js引用文件放在</body>前面,而不是放在<head>里, 目的是最后读取js文件以提高网页载入速度. 引用js文 ...

  2. javascript高级程序设计读书笔记-事件(一)

    读书笔记,写的很乱   事件处理程序   事件处理程序分为三种: 1.html事件2. DOM0级,3,DOM2级别  没有DOM1 同样的事件 DOM0会顶掉html事件   因为他们都是属性  而 ...

  3. Javascript高级程序设计--读书笔记之理解原型对象

    先上一段代码和关系图 function Person(){} Person.prototype.name = "Nic" Person.prototype.age = 22 Per ...

  4. Javascript高级程序设计读书笔记(第六章)

    第6章  面向对象的程序设计 6.2 创建对象 创建某个类的实例,必须使用new操作符调用构造函数会经历以下四个步骤: 创建一个新对象: 将构造函数的作用域赋给新对象: 执行构造函数中的代码: 返回新 ...

  5. JavaScript高级程序设计-读书笔记(7)

    第22章 高级技巧 1.高级函数 (1)安全的类型检测 在任何值上调用Object原生的toString()方法,都会返回一个[object NativeConstructorName]格式的字符串. ...

  6. JavaScript高级程序设计-读书笔记(6)

    第20章 JSON JSON是一个轻量级的数据格式,可以简化表示复杂数据结构的工作量 JSON的语法可以表示一下三种类型的值 l        简单值:使用与JavaScript相同的语法,可以在JS ...

  7. JavaScript高级程序设计-读书笔记(5)

    第13章 事件 1.事件流 事件流描述的是从页面中接收事件的顺序.IE的事件流是事件冒泡流,而Netscape Communicator的事件流是事件捕获流. (1)事件冒泡,即事件开始时由最具体的元 ...

  8. JavaScript高级程序设计-读书笔记(4)

    第11章 DOM扩展 1.选择符API Selector API Level 1 的核心是两个方法:querySelector()和querySelectorAll().在兼容的浏览器中,可以通过Do ...

  9. JavaScript高级程序设计-读书笔记(3)

    第8章 BOM 1.window对象 (1)全局作用域 BOM的核心对象是window,它表示浏览器的一个实例.在浏览器中,window对象既是通过JavaScript访问浏览器窗口的一个接口,又是E ...

  10. JavaScript高级程序设计-读书笔记(2)

    第6章 面向对象的程序设计 创建对象 1.最简单方式创建Object的实例,如 var person = new Object(); person.name = “Greg”; person.age ...

随机推荐

  1. HDU 4344 随机法判素数(费马小定理

    #include <cstdio> #include <ctime> #include <cmath> #include <algorithm> usi ...

  2. 深入探讨MFC消息循环和消息泵

    首先,应该清楚MFC的消息循环(::GetMessage,::PeekMessage),消息泵(CWinThread::PumpMessage)和MFC的消息在窗口之间的路由是两件不同的事情.在MFC ...

  3. Ubuntu通过源代码编译安装Octave 4.0

    本教程/笔记,意在指导在Ubuntu及其它Linux系统上怎样通过源代码安装Octave. Octave简单介绍 Octave是GNU旗下取代matlab的数学工具软件,语法与matlab高度兼容.而 ...

  4. Tomcat 配置WEB虚拟映射 及 配置虚拟主机

    Tomcat  配置WEB虚拟映射 及 配置虚拟主机 配置WEB虚拟映射文件夹有三种方法例如以下: 第一(要重新启动server的): 打开路径 Tomcat 6.0\conf 下的 server.x ...

  5. 忽然想到:QProcess的Read功能太强,如果有什么搞不定的,可以调用外部程序 good

    这样就可以用其它语言来无限扩展它的功能了,比如golang,比如Delphi

  6. [置顶] Cocos2d-x 实例源码分析之二 小实例的主框架

    这篇文章是分析第一个小实例ActionTest的源码.其实所有实例程序的结构都是一样的,只有特定方法里的代码不同,大的框架都是一样的.也就是说看完这篇文章你就可以自己开始分析其他源码了. 废话不多说, ...

  7. delphi 自我删除和线程池(1000行代码,需要仔细研究)

    unit Unit4; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  8. WCF(1)----服务创建

    本例中,我们通过一个关于Camera的服务为例子来说明WCF的开发流程,该服务比较简单,只是用来实现对Camera的添加,枚举,删除等操作. 详细步骤如下: 1:创建一个WCF Service Lib ...

  9. Hadoop大数据面试--Hadoop篇

    本篇大部分内容參考网上,当中性能部分參考:http://blog.cloudera.com/blog/2009/12/7-tips-for-improving-mapreduce-performanc ...

  10. Android NDK入门实例 计算斐波那契数列二生成.so库文件

    上一篇文章输生成了jni头文件,里面包含了本地C代码的信息,提供我们引用的C头文件.下面实现本地代码,再用ndk-build编译生成.so库文件.由于编译时要用到make和gcc,这里很多人是通过安装 ...