一、工厂模式
function createPerson(name,age){
var o = {};
o.name = name;
o.age = age;
o.sayHi = function(){
alert('my name is' + this.name);
};
return o;
}
var p1 = createPerson('小明',10);
var p2 = createPerson('小红',9);
p1.sayHi();
p2.sayHi();
console.log(p1.constructor); //Object
console.log(p2.constructor); //Object
 
工厂模式可以创建多个对象,但是并不知道对象的类型,因为都指向了Object
二、构造函数模式
function Person(name,age){
this.name = name;
this.age = age;
this.sayHi = function(){
alert('my name is' + this.name);
};
}
var p1 = new Person('小明',10);
var p2 = new Person('小红',9);
p1.sayHi();
p2.sayHi();
console.log(p1.constructor); //Person(name,age)
console.log(p2.constructor); //Person(name,age)
console.log(p1.sayHi==p2.sayHi);//false

p1的sayHi方法和p2的sayHi方法是不同的,说明每new一个对象就会创建一个sayHi方法,其实这完全没必要,也会浪费空间。

当然代码可以改写如下:
function Person(name,age){
this.name = name;
this.age = age;
this.sayHi = sayHi;
}
function sayHi(){
alert('my name is' + this.name);
}
var p1 = new Person('小明',10);
var p2 = new Person('小红',9);
p1.sayHi();
p2.sayHi();
console.log(p1.constructor); //Person(name,age)
console.log(p2.constructor); //Person(name,age)
console.log(p1.sayHi==p2.sayHi);//true

这时它们方法所指向的代码块就相同,即共用了一个方法。但其实没有必要为了一个类的特权方法就创建一个全局的方法,也会使得这个类显得比较凌乱。

第三、原型链模式
function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype.sayHi =function(){
alert('my name is' + this.name);
}
var p1 = new Person('小明',10);
var p2 = new Person('小红',9);
p1.sayHi();
p2.sayHi();
console.log(p1.constructor); //Person(name,age)
console.log(p2.constructor); //Person(name,age)
console.log(p1.sayHi==p2.sayHi);//true

对于原型链来创建对象,可以看到对象引用的方法是同一个方法,即类的共有方法。这样极大的节约了代码空间,不会每new一个对象就就类的所有方法创建一遍。

对于对象的特权属性、方法和共有属性、方法在javascript中类的属性研究 这篇文章中有所介绍。

javascript继承(二)—创建对象的三种模式的更多相关文章

  1. JavaScript中创建对象的三种模式

    JS中,便于批量创建对象的三种模式: 1.工厂模式:用一个函数封装创建对象的细节,传入必要的参数,在函数内部new一个对象并返回. 缺点:创建的对象无法识别类型(全是Object) 2.构造函数模式: ...

  2. javascript 创建对象的7种模式

    使用字面量方式创建一个 student 对象: var student = function (){ name : "redjoy", age : 21, sex: women, ...

  3. Javascript 创建对象的三种方法及比较【转载+整理】

    https://developer.mozilla.org/zh-CN/docs/JavaScript/Guide/Inheritance_and_the_prototype_chain 本文内容 引 ...

  4. Intel微处理器学习笔记(二) 三种模式

    三种模式:实模式.保护模式和平展模式. 实模式存储器(DOS存储器)位于00000H~FFFFFH,共1M空间(任何型号微处理器都支持). 保护模式存储器(Windows存储器)可位于整个保护存储系统 ...

  5. js创建对象的三种方式和js工厂模式创建对象

    文章地址: https://www.cnblogs.com/sandraryan/ 创建对象 创建对象的三种方式 构造函数 ,是一种特殊的方法.主要用来在创建对象时初始化对象 1. 调用系统的构造函数 ...

  6. JavaScript中创建对象的三种方式!

    JavaScript中创建对象的三种方式! 第一种 利用对象字面量! // 创建对象的三种方式! // 1 对象字面量. var obj = { // 对象的属性和方法! name: 'lvhang' ...

  7. git push :推送本地更改到远程仓库的三种模式

    摘要:由于在git push过程中,no-fast-forward 的push会被拒绝,如何解决git push失败的问题?这里面有三种方法,分别会形成merge形式的提交历史,线性形式的提交历史,覆 ...

  8. LVS三种模式配置及优点缺点比较

    目录: LVS三种模式配置 LVS 三种工作模式的优缺点比较 LVS三种模式配置 LVS三种(LVS-DR,LVS-NAT,LVS-TUN)模式的简要配置 LVS是什么: http://www.lin ...

  9. LVS三种模式配置及优点缺点比较 转

    LVS三种模式配置及优点缺点比较   作者:gzh0222,发布于2012-11-12,来源:CSDN   目录: LVS三种模式配置 LVS 三种工作模式的优缺点比较 LVS三种模式配置 LVS三种 ...

随机推荐

  1. Altium Designer PCB制作入门实例

    概要:本章旨在说明如何生成电路原理图.把设计信息更新到PCB文件中以及在PCB中布线和生成器件输出文件.并且介绍了工程和集成库的概念以及提供了3D PCB开发环境的简要说明.欢迎使用Altium De ...

  2. Java基础の第一弹

    一.虚拟机的工作机制 (1) :通过 ClassLoader 寻找和装载 class 文件 (2) :解释字节码成为指令并执行,提供 class 文件的运行环境 (3) :进行运行期间垃圾回收 (4) ...

  3. find type d 命令批量删除禁用

    [root@qike ~]# find  /usr/local/sbin/  -type d  /usr/local/sbin//usr/local/sbin/2/usr/local/sbin/g/u ...

  4. 关于HADOOP HA 中DFSZKFC的理解

    [转自uc技术博客:http://tech.uc.cn/?p=252] FC是要和NN一一对应的,两个NN就要部署两个FC.它负责监控NN的状态,并及时的把状态信息写入ZK.它通过一个独立线程周期性的 ...

  5. 孙鑫视频学习:“operator +=” 不明确的问题解决方法

    在基于单文档应用程序的MFC程序中,在OnChar函数中使用m_strLine+=nChar时,出现了error C2593:“operator +=”不明确的错误,经百度,找到如下解决方法,亲测可用 ...

  6. HDU 4930 Fighting the Landlords --多Trick,较复杂模拟

    题意:两个人A和B在打牌,只有题目给出的几种牌能出若A第一次出牌B压不住或者A一次就把牌出完了,那么A赢,输出Yes,否则若A牌没出完而且被B压住了,那么A输,输出No. 解法:知道规则,看清题目,搞 ...

  7. find命令错误提示路径必须在表达式之前

    在某些版本的linux下,通过find查找当前目录下所有后缀名jpg的文件,命令为find ./ -iname *.jpg 会出现“find: 路径必须在表达式之前”的错误提示.解决的方法有两种 a. ...

  8. 搞懂function(*args,**kwargs)

    给出一个例子: def foo(*args,**kwargs): print 'args=',args print 'kwargs=',kwargs print '------------------ ...

  9. RelayCommand命令

    原文:http://www.cnblogs.com/xiepeixing/archive/2013/08/13/3255152.html 常用Wpf开发中我们在ViewModel中实现INotifyP ...

  10. redmine Windows装配

    原文:http://www.myexception.cn/windows/1219064.html redmine Windows安装 官方地址:http://www.redmine.org/ 所需环 ...