浅析创建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 相关文章推荐
动态表格Table类的实现
Aug 26 Javascript
本地对象Array的原型扩展实现代码
Dec 04 Javascript
用JS实现3D球状标签云示例代码
Dec 01 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
Dec 29 Javascript
js实现仿Windows风格选项卡和按钮效果实例
May 13 Javascript
JS使用eval解析JSON的注意事项分析
Nov 14 Javascript
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
Jun 07 Javascript
微信小程序 vidao实现视频播放和弹幕的功能
Nov 02 Javascript
js封装成插件的步骤方法
Sep 11 Javascript
vue实现浏览器全屏展示功能
Nov 27 Javascript
详解 javascript对象创建模式
Oct 30 Javascript
详解Vue数据驱动原理
Nov 17 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
别人整理的服务器变量:$_SERVER
2006/10/20 PHP
smarty模板嵌套之include与fetch性能测试
2010/12/05 PHP
基于PHP微信红包的算法探讨
2016/07/21 PHP
兼容FF和IE的动态table示例自写
2013/10/21 Javascript
JQuery解析HTML、JSON和XML实例详解
2014/03/29 Javascript
jquery.uploadify插件在chrome浏览器频繁崩溃解决方法
2015/03/01 Javascript
BootStrap的table表头固定tbody滚动的实例代码
2016/08/24 Javascript
jQuery Ajax File Upload实例源码
2016/12/12 Javascript
微信小程序 video详解及简单实例
2017/01/16 Javascript
JavaScript提高加载和执行效率的方法
2017/02/03 Javascript
AngularJS实现根据不同条件显示不同控件
2017/04/20 Javascript
node跨域请求方法小结
2017/08/25 Javascript
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
浅谈vue websocket nodeJS 进行实时通信踩到的坑
2020/09/22 NodeJs
学习python类方法与对象方法
2016/03/15 Python
Python利用Beautiful Soup模块搜索内容详解
2017/03/29 Python
python批量实现Word文件转换为PDF文件
2018/03/15 Python
Python使用爬虫爬取静态网页图片的方法详解
2018/06/05 Python
PyCharm设置SSH远程调试的方法
2018/07/17 Python
python一键去抖音视频水印工具
2018/09/14 Python
python环境路径配置以及命令行运行脚本
2019/04/02 Python
python打开音乐文件的实例方法
2020/07/21 Python
python基于opencv实现人脸识别
2021/01/04 Python
HTML5+CSS3实现拖放(Drag and Drop)示例
2014/07/07 HTML / CSS
美国知名男士服饰品牌:Brooks Brothers(布克兄弟)
2016/08/25 全球购物
DJI大疆无人机官方商城:全球领先的无人飞行器研发和生产商
2016/12/21 全球购物
英国高级百货公司:Harvey Nichols
2017/01/29 全球购物
Laura官网:加拿大女性的顶级时尚目的地
2019/09/20 全球购物
adidas爱尔兰官方网站:阿迪达斯运动鞋和运动服
2019/11/01 全球购物
英语专业毕业生自荐信范文
2013/12/31 职场文书
新闻学专业个人求职信写作
2014/02/04 职场文书
幼儿园中班教师寄语
2014/04/03 职场文书
社会实践活动总结范文
2014/07/03 职场文书
材料化学专业求职信
2014/07/15 职场文书
关于党风廉政建设宣传教育月的活动总结!
2019/08/08 职场文书
Python中可变和不可变对象的深入讲解
2021/08/02 Python