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

创建对象


工厂模式

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

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

function createPerson(name,age,job)
{var o=new Object();o.name=name;o.age=age;o.job=job;o.sayName=function(){alert(this.name);};return o;
}
var person1=createPerson("Jack",29,"Engineer");//检测对象类型
alert(person1 instanceof Object) //true
alert(person1 instanceof Person) //error Person is not defined

View Code

构造函数模式

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

function Person(name,age,job)
{this.name=name;this.age=age;this.job=job;this.sayName=function(){alert(this.name);};
}
var person1=new Person("Jack",29,"Engineer");//检测对象类型
alert(person1 instanceof Object) //true
alert(person1 instanceof Person) //true

View Code

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

function Person(name,age,job)
{this.name=name;this.age=age;this.job=job;this.sayName=function(){alert(this.name);};
}
//以构造函数模式调用
var person1=new Person("Jack",29,"Engineer");
person1.sayName();//Jack//以普通函数调用
Person("Lily",25,"Actor");//执行环境为全局执行环节,this指向window
window.sayName();//Lily//在另一个对象的作用域中调用
var o=new Object();
Person.apply(o,["Jim",21,"Teacher"]);//扩展Person至实例对象o的作用域
o.sayName();//Jim

View Code

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

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

function Person(name,age,job)
{this.name=name;this.age=age;this.job=job;this.sayName=sayName;
}
function sayName(){alert(this.Name);
}
var person1=new Person("Karl",28,"Doctor");

View Code

原型模式

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

function Person()
{
}
Person.prototype.name="Jim";
Person.prototype.age=29;
Person.prototype.job="Teacher";
Person.prototype.sayName=function(){alert(this.Name);
};
var person1=new Person();
person1.sayName();//"Jim"
var person2=new Person();
alert(person1.sayName==person2.sayName);//true

View Code

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

原型模式简易写法

function Person()
{
}
Person.prototype={constructor:Person,//对象字面量创建了新对象,如不指定,constructor指向了Objectname:"Jim",age:29,job:"Teacher",sayName:function(){alert(this.name);}
};

View Code

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

构造器与原型混合模式

function Person(name,age,job)
{    this.name=name;this.age=age;this.job=job;this.friends=["Tom","Jack"];
}
Person.prototype={constructor:Person,//对象字面量创建了新对象,如不指定,constructor指向了ObjectsayName:function(){alert(this.name);}
};var person1=new Person("Jim",25,"Teacher");
var person2=new Person("Lily",20,"Actor");
person1.friends.push("Mark");
alert(person1.friends===person2.friends);//false
alert(person1.sayName===person2.sayName);//true

View Code

动态原型模式

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

function Person(name,age,job)
{    this.name=name;this.age=age;this.job=job;this.friends=["Tom","Jack"];//方法if(typeof this.sayName != "function"){Person.prototype.sayName=function(){alert(this.name);};}
}

View Code

转载于:https://www.cnblogs.com/GongQi/p/4026198.html

《Javascript高级程序设计》读书笔记之对象创建相关推荐

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

    <!DOCTYPE HTML>//这个网页的文档类型,这个是html5的写法 Bootstrap使用的某些HTML元素和CSS属性需要文档类型为HTML5 doctype.因此这一文档类型 ...

  2. JavaScript高级程序设计读书笔记(第8章BOM之location对象查询字符串参数)

    为什么80%的码农都做不了架构师?>>> location对象查询字符串参数 //location.search返回从问号到URL末尾的所有内容function getQuerySt ...

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

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

  4. javascript高级程序设计读书笔记----引用类型

    Array类型. ECMAScript数组的每一项可以保存任何类型的数据. 数组大小是可以动态调整的. 创建数组第一种基本方式方式: 使用Array构造函数 var colors = new Arra ...

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

    第一章 总结: JavaScript是一种专为与网页交互设计的脚本语言. 由三个不同的部分组成: ECMAScript, 由ECMA-262定义,提供核心语言功能: DOM(文件对象模型),提供访问和 ...

  6. JavaScript高级程序设计读书笔记(第6章面向对象的程序设计之创建对象)

    2019独角兽企业重金招聘Python工程师标准>>> 面向对象语言都有"类"的概念,而通过类可以创建任意多个具有相同属性和方法的对象. JS中没有"类 ...

  7. Javascript高级程序设计--读书笔记--第八章BOM

    BOM(browser object model 浏览器对象模型) BOM的核心对象是window,它表示浏览器的一个实例.在浏览器钟,window对象有双重角色,它既是通过javascript 访问 ...

  8. JavaScript高级程序设计读书笔记(第5章引用类型之Array类型)

    为什么80%的码农都做不了架构师?>>> 1.数组长度 //lenth会自动更新 var arr=["black","red","g ...

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

    浮点数虽然精度很高,但在实际计算中的精度可能不如整数.比如0.1+0.2并不等于0.3,而是0.3000000000000004,所以把浮点数的计算结果当做判断条件会产生失误,这是基于IEEE754数 ...

  10. 《javascript高级程序设计》笔记:变量对象与预解析

    上一篇:<javascript高级程序设计>笔记:内存与执行环境 上篇文章中说到: (1)当执行流进入函数时,对应的执行环境就会生成 (2)执行环境创建时会生成变量对象,确定作用域链,确定 ...

最新文章

  1. hadoop2.2.0 集群安装配置
  2. 关于字符串属性的几道面试题目
  3. 【数值分析】微分求积:复化梯形、复化辛浦生
  4. LeetCode 809. 情感丰富的文字
  5. deprecated conversion from string constant to ‘char*’
  6. 习题:输出九九乘法表
  7. bzoj5248(洛谷4363)(2018九省联考)一双木棋
  8. 【codevs1295】N皇后问题
  9. HTML5微数据学习笔记
  10. Matlab R2017a启动时初始化过程时间太长解决办法
  11. 快速了解Mybatis Plus 的用法以及使用举例
  12. 快速学习Grasshopper的方法
  13. 圆方树总结 [uoj30]Tourists
  14. 路由器指定dns解析服务器设置
  15. Java 面向对象(一)
  16. caffe 中的损失函数分析
  17. python配置opencv最简单_Python版本OpenCV安装配置及简单实例
  18. 敏捷观点和态度-《敏捷项目管理》读后感
  19. GRASPIT安装流程
  20. 开发笔记之数字证书(一):数字证书介绍

热门文章

  1. 机器人编程语言python-个人微信接入图灵机器人(基于Python)
  2. python爬虫入门代码-如何开始写你的第一个爬虫脚本——简单爬虫入门!
  3. python画直方图成绩分析-python plotly绘制直方图实例详解
  4. python中的装饰器有哪些-python 装饰器以及开发中常用的例子
  5. 用python画玫瑰花代码-Python | 用turtle库画玫瑰花
  6. python雷达图-Python成绩单雷达图
  7. python软件界面-用Html来写Python桌面软件的UI界面-htmlPy
  8. python基础教程书籍推荐-python入门书籍推荐
  9. 学python可以做什么职业好-业余学Python能做什么?对职业发展有什么帮助?
  10. python if语句多个条件-Python 条件语句(if..elif..else)