浅析创建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 相关文章推荐
jQuery asp.net 用json格式返回自定义对象
Apr 07 Javascript
JS分页控件 可用于无刷新分页
Jul 23 Javascript
jquery 表格排序、实时搜索表格内容(附图)
May 19 Javascript
jQuery实现滑动页面固定顶部显示(可根据显示位置消失与替换)
Oct 28 Javascript
JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
Jun 24 Javascript
深入理解JS中的Function.prototype.bind()方法
Oct 11 Javascript
JavaScript实现HTML5游戏断线自动重连的方法
Sep 18 Javascript
vue的无缝滚动组件vue-seamless-scroll实例
Dec 18 Javascript
angular的输入和输出的使用方法
Sep 22 Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
Nov 05 Javascript
vue中jsonp插件的使用方法示例
Sep 10 Javascript
JavaScript中的Proxy对象
Nov 27 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递归调用与静态变量使用
2012/12/16 PHP
PHP中ob_start函数的使用说明
2013/11/11 PHP
php使用curl访问https示例分享
2014/01/17 PHP
PHP 读取和编写 XML
2014/11/19 PHP
Json_encode防止汉字转义成unicode的方法
2016/02/25 PHP
完美解决Thinkphp3.2中插入相同数据的问题
2017/08/01 PHP
js不是基础的基础
2006/12/24 Javascript
javascript基础的动画教程,直观易懂
2007/01/10 Javascript
javascript new fun的执行过程
2010/08/05 Javascript
Javascript 检测键盘按键信息及键码值对应介绍
2013/01/03 Javascript
js实现的map方法示例代码
2014/01/13 Javascript
js实现通用的微信分享组件示例
2014/03/10 Javascript
JS中使用sort结合localeCompare实现中文排序实例
2014/07/23 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
2014/12/10 Javascript
AngularJS入门教程之AngularJS指令
2016/04/18 Javascript
JS点击图片弹出文件选择框并覆盖原图功能的实现代码
2017/08/25 Javascript
VsCode新建VueJs项目的详细步骤
2017/09/23 Javascript
讲解vue-router之什么是编程式路由
2018/05/28 Javascript
Angular6 发送手机验证码按钮倒计时效果实现方法
2019/01/08 Javascript
微信小程序实现多选删除列表数据功能示例
2019/01/15 Javascript
使用jquery的cookie实现登录页记住用户名和密码的方法
2019/03/13 jQuery
处理Python中的URLError异常的方法
2015/04/30 Python
itchat和matplotlib的结合使用爬取微信信息的实例
2017/08/25 Python
Python3.5基础之函数的定义与使用实例详解【参数、作用域、递归、重载等】
2019/04/26 Python
python正则爬取某段子网站前20页段子(request库)过程解析
2019/08/10 Python
python运用sklearn实现KNN分类算法
2019/10/16 Python
使用django和vue进行数据交互的方法步骤
2019/11/11 Python
详解前端HTML5几种存储方式的总结
2016/12/27 HTML / CSS
德国玩具商店:Planet Happy DE
2021/01/16 全球购物
外包公司软件测试工程师
2014/11/01 面试题
幼儿园大班个人总结
2015/02/28 职场文书
《刷子李》教学反思
2016/02/20 职场文书
创业方案:赚钱的烧烤店该怎样做?
2019/07/05 职场文书
2021年pycharm的最新安装教程及基本使用图文详解
2021/04/03 Python
使用goaccess分析nginx日志的详细方法
2021/07/09 Servers
Java后台生成图片的完整步骤
2021/08/04 Java/Android