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

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

当然代码可以改写如下:
  1. function Person(name,age){
  2. this.name = name;
  3. this.age = age;
  4. this.sayHi = sayHi;
  5. }
  6. function sayHi(){
  7. alert('my name is' + this.name);
  8. }
  9. var p1 = new Person('小明',10);
  10. var p2 = new Person('小红',9);
  11. p1.sayHi();
  12. p2.sayHi();
  13. console.log(p1.constructor); //Person(name,age)
  14. console.log(p2.constructor); //Person(name,age)
  15. console.log(p1.sayHi==p2.sayHi);//true

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

第三、原型链模式
  1. function Person(name,age){
  2. this.name = name;
  3. this.age = age;
  4. }
  5. Person.prototype.sayHi =function(){
  6. alert('my name is' + this.name);
  7. }
  8. var p1 = new Person('小明',10);
  9. var p2 = new Person('小红',9);
  10. p1.sayHi();
  11. p2.sayHi();
  12. console.log(p1.constructor); //Person(name,age)
  13. console.log(p2.constructor); //Person(name,age)
  14. 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. Swift 学习笔记 enum 枚举类型

    异端,异端啊,我感觉这是map吧? enum ATMStatus { case Success(Int) case Error(String) } func withdraw(amount: Int) ...

  2. linux下对2个连通的串口读写遇到的问题

    想要分析下zmodem协议,搜索发现linux下的工具lrzsz是一个包含x,y,z modem传输的工具,下载其源码,下载.它可以借助各种串行的接口进行数据传输,比如串口,socket也可以,这点描 ...

  3. SQL-一道特殊的字符串分解题目

    本题不是一道直接的字符串拆解, 应用场景如下,表中有一个字段,是表示事件受影响的国家集合,使用逗号进行分隔,不幸的是,居然发现有些国家本身就带有逗号,这样在规范化的时候,如何准确地找到这些国家呢? 以 ...

  4. hdu1047 Integer Inquiry

    /* Integer Inquiry Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...

  5. opencv3.1 + opencv_contrib编译记事(win7下)

    折腾了好几天,终于把opencv3.1加上一个额外的包opencv_contrib编译好了.(总体来说编译opencv就是填坑!!!) 最后我编译成功的是mingw版本的.也就是结合了Qt4.7+cm ...

  6. ZOJ 2674 Strange Limit

    欧拉函数. #include<iostream> #include<stdio.h> #include<string.h> #include<algorith ...

  7. 关于jQuery的一些实用代码

    (1)修改默认编码:(将默认的utf-8,修改为GB2312) $.ajaxSetup({ ajaxSettings:{contentType:"application/x-www-from ...

  8. 云盘WEB资料下载链接

    入门三板斧:http://www.cnblogs.com/jikey/p/3613082.html 入门看这个:http://pan.baidu.com/s/1pJqJvAV 入门JS视频:http: ...

  9. pedestal-工作记

    1.基于bootstrap-v3和flat-ui-v3为第十届外语活动月写了个页面 http://www.pedestal.cn/static/activity/index.html 2.资料 boo ...

  10. Eclipse调试按钮消失问题

    Window-->Reset Perspective 把Eclipse重置一下,然后 点击红色框圈的向下的箭头,在弹出的菜单里边,点击 show debug toolbar 这个菜单项目,然后奇 ...