浅析创建javascript对象的方法


Posted in Javascript onMay 13, 2016

一、工厂模式

function person (name,age) {
  var p=new Object();
  p.name=name;
  p.age=age;
  p.showMessage=function(){
    console.log("name:"+this.name+" age:"+this.age);
  }
  return p;
}
var p1=person("k1",28);
var p2=person("k2",29);
console.log(p1.showMessage==p2.showMessage);//false 不是同一个showMessage方法
console.log(p1.constructor);//[object] 都是object

工厂模式的缺陷是:没解决对象识别的问题,而且每个对象的showMessage方法都不是同一个方法(每个方法在每个对象实例上都重新创建了一遍),增加了开销

二、构造函数模式

function Person (name,age) {
  this.name=name;
  this.age=age;
  this.showMessage=function(){
    console.log("name:"+this.name+" age:"+this.age);
  }
}
var p1=new Person("k1",28);
var p2=new Person("k2",29);
console.log(p1.showMessage==p2.showMessage);//false 不是同一个showMessage方法
console.log(p1.constructor);//[Person]
console.log(p1 instanceof Person);// true

构造函数模式解决了对象识别的问题,但是每个对象的showMessage方法不是同一个方法(每个方法在每个对象实例上都重新创建了一遍),增加了开销

三、原型模式

function Person () {
  
}
Person.prototype.name ="k";
Person.prototype.age =29;
Person.prototype.showMessage=function () {
  console.log("name:"+this.name+" age:"+this.age);
};

var p1=new Person();
p1.showMessage();//name:k age:29

var p2=new Person();
p2.showMessage();//name:k age:29

console.log(p1.showMessage==p2.showMessage);// true --引用的是同一函数
console.log(p1.constructor)//[Person] --对象识别
console.log(p1 instanceof Person)//true --对象识别
console.log(Person.prototype.isPrototypeOf(p1));// true
console.log(Object.getPrototypeOf(p1)==Person.prototype);// true

原型模式解决了“每个方法在每个对象实例上都重新创建了一遍”的问题,也解决了对象识别的问题

原型模式有个很大的问题是,因为挂载在函数prototype下面的所有对象、变量、函数都是被该函数的所有实例共享的,虽然通过实例p1、p2可以访问到prototype的属性,但是却不能修改属性值,例如p1.name="k1",只是在p1实例上添加了一个name="k1"的属性,并没改到prototype.name。如果是值类型还好,如果是引用类型的话,就会有问题了,看如下的例子

function Person () {  
};
Person.prototype.age =10;
Person.prototype.array=[1,2,3];

var p1=new Person();
var p2=new Person();
console.log(p1.array);// [1,2,3]
console.log(p2.array); //[1,2,3]
p1.array.push(4);
console.log(p1.array);//[1,2,3,4]
console.log(p2.array);//[1,2,3,4]

p1往array里面添加了值,在p2也反映出来了,因为他们都是指向同一个array

四、组合使用构造函数模式和原型模式

这是最常见的创建对象的方式,结合了构造函数和原型模式的优点

function Person (name,age) {
  this.name=name;
  this.age=age;
}

Person.prototype.showMessage = function() {
  console.log("name:"+this.name+" age:"+this.age);
};

var p1=new Person("k",30);
p1.showMessage();

五、动态原型模式

主要是解决:把所有的信息都封装在构造函数中,更符合oo的思想

function Person (name,age) {
  this.name=name;
  this.age=age;
  if(typeof this.showMessage!="function"){
    Person.prototype.showMessage=function(){
      console.log("name:"+this.name+" age:"+this.age);
    }
  }
}

var p1=new Person("k",30);
p1.showMessage();

六、寄生构造函数模式

function Person (name,age) {
  var o=new Object();
  o.name=name;
  o.age=age;
  o.sayName=function(){
    console.log(this.name);
  };
  return o;
}
var p1=new Person("k",28);
p1.sayName();

寄生构造函数模式和工厂模式是一模一样的,只不过创建对象的时候使用了new 关键字,上例:var p1=new Person("k",28)。

它的主要作用是:在这个构造函数里面进行功能的扩展,例如,我想定义一个数组类型MyArray,它是以Array数组为基础的,有一个自己的方法,如下

function MyArray(){
  var values=new Array();
  values.push.apply(values,arguments);
  //自己定义的方法
  values.toPipedString=function(){ 
    return this.join('|');
  };
  return values;
}
var colors=new MyArray("red","blue","green");
console.log(colors.toPipedString());
console.log(colors instanceof Array);

七、稳妥构造函数模式

稳妥构造函数遵循与寄生构造函数类型的模式,但有两点不同:一是不使用this,二是不使用new 调用构造函数

function Person (name,age) {
  var o=new Object();
  var tempAge=age;

  o.name=name;
  o.age=age;

  o.sayName=function(){
    console.log(name);
  }
  o.sayAge=function(){
    console.log(tempAge);
  }
  return o;
}

var p1=Person("k1",28);
p1.sayName(); // k1
p1.sayAge(); // 28

p1.name="k2";
p1.age=30;
p1.sayName(); // k1
p1.sayAge();  //28

看到如上的输出就很好理解什么叫稳妥对象模式了,就是用这种模式创建的对象,没有其他办法能够改变初始化时候传入的值,这里是Person("k1",28),这样的对象就是稳妥对象,实际上这里使用到就是javascript的闭包了。

以上这篇浅析创建javascript对象的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript 面向对象 命名空间
May 13 Javascript
解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
May 13 Javascript
Ajax请求在数据量大的时候出现超时的解决方法
Feb 27 Javascript
高性能JavaScript模板引擎实现原理详解
Feb 05 Javascript
js查看一个函数的执行时间实例代码
Sep 12 Javascript
JavaScript制作淘宝星级评分效果的思路
Jun 23 Javascript
在 Express 中使用模板引擎
Dec 10 Javascript
不使用script导入js文件的几种方法
Oct 27 Javascript
基于jQuery中ajax的相关方法汇总(必看篇)
Nov 08 jQuery
vue2.0 子组件改变props值,并向父组件传值的方法
Mar 01 Javascript
vue使用原生js实现滚动页面跟踪导航高亮的示例代码
Oct 25 Javascript
JS中的继承操作实例总结
Jun 06 Javascript
全面理解JavaScript中的闭包
May 12 #Javascript
Bootstrap框架动态生成Web页面文章内目录的方法
May 12 #Javascript
Node.js的项目构建工具Grunt的安装与配置教程
May 12 #Javascript
js自定义select下拉框美化特效
May 12 #Javascript
使用jQuery制作遮罩层弹出效果的极简实例分享
May 12 #Javascript
JS函数的定义与调用方法推荐
May 12 #Javascript
使用jQuery实现Web页面换肤功能的要点解析
May 12 #Javascript
You might like
用PHP读注册表
2006/10/09 PHP
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安装配置图文教程 2009年
2009/06/08 PHP
php的memcached客户端memcached
2011/06/14 PHP
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
2013/06/18 PHP
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
2015/09/22 PHP
PHP指定截取字符串中的中英文或数字字符的实例分享
2016/03/18 PHP
PHP面向对象五大原则之依赖倒置原则(DIP)详解
2018/04/08 PHP
JS实现打开本地文件或文件夹
2021/03/09 Javascript
IE6 弹出Iframe层中的文本框“经常”无法获得输入焦点
2009/12/27 Javascript
JS实现5秒钟自动封锁div层的方法
2015/02/20 Javascript
学习JavaScript编程语言的8张思维导图分享
2015/03/27 Javascript
jquery判断至少有一个checkbox被选中的方法
2015/06/05 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
2015/09/14 Javascript
使用JavaScript和CSS实现文本隔行换色的方法
2015/11/04 Javascript
JavaScript数据结构之二叉树的删除算法示例
2017/04/13 Javascript
在vue中添加Echarts图表的基本使用教程
2017/11/22 Javascript
10个经典的网页鼠标特效代码
2018/01/09 Javascript
JavaScript中的E-mail 地址格式验证
2018/03/28 Javascript
vue 集成jTopo 处理方法
2019/08/07 Javascript
如何通过JS实现转码与解码
2020/02/21 Javascript
[05:48]DOTA2英雄梦之声vol21 屠夫
2014/06/20 DOTA
[04:22]DOTA2大事件之护国神翼
2020/08/14 DOTA
对python抓取需要登录网站数据的方法详解
2018/05/21 Python
利用Django模版生成树状结构实例代码
2019/05/19 Python
Python绘制堆叠柱状图的实例
2019/07/09 Python
你应该知道的Python3.6、3.7、3.8新特性小结
2020/05/12 Python
为什么说python更适合树莓派编程
2020/07/20 Python
Linux内核产生并发的原因
2012/07/13 面试题
铲车司机岗位职责
2014/03/15 职场文书
部门活动策划方案
2014/08/16 职场文书
科学发展观活动总结
2014/08/28 职场文书
入股合作协议书
2014/10/12 职场文书
2015年党员创先争优公开承诺书
2015/04/27 职场文书
赢在中国观后感
2015/06/02 职场文书
2016春季运动会通讯稿
2015/07/18 职场文书
90后经典动画片排行:《数码宝贝》第二,《小鲤鱼历险记》在榜
2022/03/18 日漫