《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

构造函数模式

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

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

构造函数也是函数,如果不通过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

构造函数模式缺点在于实例方法无法复用,创建两个对象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");

原型模式

每个函数都有一个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

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

原型模式简易写法

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

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

构造器与原型混合模式

function Person(name,age,job)
{
this.name=name;
this.age=age;
this.job=job;
this.friends=["Tom","Jack"];
}
Person.prototype={
constructor:Person,//对象字面量创建了新对象,如不指定,constructor指向了Object
sayName: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

动态原型模式

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

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);
};
}
}

最新文章

  1. linux内核分析作业8:理解进程调度时机跟踪分析进程调度与进程切换的过程
  2. IOS开发基础知识--碎片33
  3. [Linux编程] module_param()函数学习笔记
  4. DevExpress TreeList 那些事儿
  5. Routing and controllers
  6. 【LeetCode练习题】Permutations
  7. Windows API 之 ReadProcessMemory
  8. EXE转JPG后缀格式工具(真实JPG后缀)
  9. 详解Office Add-in 清单文件
  10. 【编程开发】PHP---面向对象
  11. .NET Core实战项目之CMS 第十六章 用户登录及验证码功能实现
  12. python 错误: UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
  13. P4980 【模板】Polya定理
  14. Disruptor底层实现讲解与RingBuffer数据结构讲解
  15. C# TripleDES NoPadding 时对待加密内容进行补字节(8个字节为一个Block)
  16. linux 的内核的作用和功能
  17. OpenCL 使用函数 clCreateProgramWithBinary 来创建程序
  18. 2018-2019-1 20165330 《信息安全系统设计基础》第六周课上测试ch02&课下作业
  19. bzoj 3545: [ONTAK2010]Peaks
  20. Netflix OSS 和 SpringCloud Netflix简介

热门文章

  1. 积累的VC编程小技巧之图标、光标及位图
  2. Windows消息队列
  3. 与众不同 windows phone (10) - Push Notification(推送通知)之推送 Tile 通知, 推送自定义信息
  4. Delphi透明组件开发(去掉自己的csOpaque,去掉父控件的WS_CLIPCHILDREN,增加WS_EX_TRANSPARENT,截获WM_ERASEBKGND,然后在WM_DRAWITEM里画) good
  5. 获取Exe文件版本信息的函数(使用GetFileVersionInfo得到TFileVersionInfo结构体,包含12项内容)
  6. 循环获取json对象的属性名
  7. 使用VC++压缩解压缩文件夹
  8. Spring Framework AOP具体解释
  9. 更改EBSserver域名/IP
  10. 30分钟快速掌握AngularJs