JS-最全的创建对象的方式
JS最全创建对象方式汇总
1.最简单的方式--创建一个Object实例
var person = new Object(); //创建实例
person.name = "BlueBeginner"; //给实例添加属性
person.age = 21; //添加属性
person.sayName = function(){ //添加方法
alert(this.name);
}
2.对象字面量
var person = {
name:'BlueBeginner',
age:21,
5:true,
sayName:function(){
alert(this.name);
}
}
以上均为创建单个对象的方法,如果只需要少数具有不同属性和方法的对象,以上方法简单方便,但是当我们需要很多具有相似属性和方法的对象时,使用以上方法显然不切实际,因为会产生大量的重复代码。以下方法,便是为创建一类对象而生。
3.工厂模式
function createPerson(name,age,job){
var o = new Object();//显式创建对象
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
}
return o;//返回对象
}
var personone = createPerson("BlueBeginner",21,"web Engineer");
var persontwo = createPerson("DJL",23,"web Engineer");
函数根据接受的参数来创建对应的对象,可以无数次的调用此函数,每次都会返回一个包含3个属性1个方法的对象。
工厂模式注意:
- 需要用var显式地创建对象
- 有return语句,返回对象
工厂模式没有解决对象的识别问题,我的理解是不能确定对象由哪个函数创建,看以下代码
alert(personone instanceof createPerson);//false
alert(personone instanceof Object);//true
4.构造函数模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
}
}
var personone = new Person("BlueBeginner",21,"web Engineer");
var persontwo = new Person("DJL",23,"web Engineer");
构造函数模式注意:
- 没有显式地创造对象
- 直接将属性和方法赋值给了this对象
- 没有return语句
- 构造函数名首字母大写
- 使用new操作符创建实例
- 创建一个新对象
- 将构造函数的作用域赋给这个对象(因此this指向这个对象)
- 执行构造函数中的代码
- 返回新对象
之所以说构造函数解决了工厂模式不能识别对象类型的问题,看下面的代码
alert(personone.sayName == persontwo.sayName);//false
这样的话,以上的两种模式都创建了两个完成同样任务的Function实例,这样做完全没必要。而且,对于构造函数模式,因为有this对象在,根本不用在执行代码前就把函数方法绑定到特定对象上面,大可像下面代码所示,将方法写到构造函数外面:
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = sayName;
}
function sayName(){
alert(this.name);
}
这样的话,所有实例共享了在全局作用域中定义的函数方法。但是很显然的是,如果需要很多很多方法呢?以这种方法,岂不是需要定义很多很多全局函数?在全局中定义的函数,只能被某些对象调用,这让全局作用域有点名不副实。好在,这些问题,可以通过原型模式来解决。
5.原型模式
function Person(){};
Person.prototype.name = "BlueBeginner";
Person.prototype.age = 21;
Person.prototype.job = "web Engineer";
Person.prototype.sayName = function(){
alert(this.name);
};
var personone = new Person();
var persontwo = new Person();
personone.sayName();//'BlueBeginner'
persontwo.sayName();//'BlueBeginner'
alert(personone.sayName == persontwo.sayName);//true
原型模式注意:
- 所有实例共享相同的属性和方法
- 对于方法和基本属性值,这样很合适,但是对于引用类型的值,却出现了问题。在实例中重写引用类型的值会修改原型中的同名属性。如下:
function Person(){};
Person.prototype = {
constructor:Person,
name:'BlueBeginner',
age:21,
friends:['DJL','ZH'],
sayName:function(){
alert(this.name);
}
}
var personone = new Person();
var persontwo = new Person();
personone.friends.push('YR');
alert(personone.friends);//'DJL','ZH','YR'
alert(persontwo.friends);//'DJL','ZH','YR'
alert(personone.friends == persontwo.friends);//true
在第一的实例personone中重写引用类型值后,第二个实例所得到的原型上的引用类型值也被修改了,这显然不尽人意。所以很少有人单独使用原型模式。
6.组合使用构造函数模式和原型模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.friends = ['DJL','ZH']
}
Person.prototype = {
constructor:Person,
sayName:function(){
alert(this.name);
}
}
var personone = new Person("BlueBeginner",21,"web Engineer");
var persontwo = new Person("DJL",23,"web Engineer");
personone.friends.push('YR');
alert(personone.friends);//'DJL','ZH','YR'
alert(persontwo.friends);//'DJL','ZH'
alert(personone.sayName === persontwo.sayName);//true
alert(personone.friends == persontwo.friends);//false
这种模式将构造函数和原型分开,在构造函数里面写属性,在原型里面写方法,可以说,这是用来定义引用类型的一种默认模式,当然,有同学看到独立的构造函数和原型时,会感到困惑,下面这个模式,便解决了这个问题。
7.动态原型模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
if(typeof this.sayName != 'function'){
Person.prototype.sayName=function(){
alert(this.name);
};
};
}
这种模式方法确实非常完美,if判断代码只会在初次调用构造函数时才会执行,此后,原型已经初始化,不需要再做什么修改了。
当然,第三版中还介绍了寄生构造函数模式和稳妥构造函数模式,但这两种模式用的很少,这里不多做介绍。有兴趣的同学请自行查阅相关资料。
JS-最全的创建对象的方式的更多相关文章
- JS高级---三种创建对象的方式
JS高级---三种创建对象的方式 字面量的方式 (实例对象) 调用系统的构造函数 自定义构造函数方式 //创建对象---->实例化一个对象,的同时对属性进行初始化 var per=new Per ...
- 史上最全的CSS hack方式一览 jQuery 图片轮播的代码分离 JQuery中的动画 C#中Trim()、TrimStart()、TrimEnd()的用法 marquee 标签的使用详情 js鼠标事件 js添加遮罩层 页面上通过地址栏传值时出现乱码的两种解决方法 ref和out的区别在c#中 总结
史上最全的CSS hack方式一览 2013年09月28日 15:57:08 阅读数:175473 做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况.基于此,某些情况我 ...
- js几种创建对象的方式
javascript是一种“基于prototype的面向对象语言“,与java有非常大的区别,无法通过类来创建对象.那么,既然是面象对象的,如何来创建对象呢? 一.通过”字面量“方式创建. 方法:将成 ...
- JS对全角与半角的验证,相互转化以及介绍
1.什么是全角和半角? 全角:是一种电脑字符,是指一个全角字符占用两个标准字符(或两个半角字符)的位置.全角占两个字节. 汉字字符和规定了全角的英文字符及国标GB2312-80中的图形符号和特殊字符都 ...
- (转)js弹窗&返回值(window.open方式)
本文转载自:http://hi.baidu.com/z57354658/item/5d5e26b8e9f42fa7ebba93d4 js弹窗&返回值(window.open方式) test.h ...
- js对象的几种创建方式和js实现继承的方式[转]
一.js对象的创建方式 1. 使用Object构造函数来创建一个对象,下面代码创建了一个person对象,并用两种方式打印出了Name的属性值. var person = new Object(); ...
- 谈谈Vue.js——vue-resource全攻略
本篇文章主要介绍了谈谈Vue.js——vue-resource全攻略,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 概述 上一篇我们介绍了如何将$.ajax和Vue. ...
- fullpage.js jq全屏滚动插件
fullPage.js和fullPage都能实现全屏滚动,二者区别是:fullPage.js需依赖于JQuery库,而fullPage不需要依赖任何一个js库,可以单独使用. (代码演示效果并且可以下 ...
- js中json法创建对象(json里面的:相当于js里面的=)
js中json法创建对象(json里面的:相当于js里面的=) 一.总结 json里面的:相当于js里面的= 4.json创建js对象解决命名冲突:多个人为同一个页面写js的话,命名冲突就有可能发生, ...
随机推荐
- C 语言 register 关键字
register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率.注意是尽可能,不是绝对.你想想,一个CPU 的寄存器也就那么几个或几十个,你要是定义了很 ...
- 身份证号校验原理及JavaScript实现
在网站中,总有各种各样的表单,用户使用表单来向服务器发送数据,进行交互. 然而,代代相传的经验是,永远不要信任用户的输入,一定要对数据进行验证.如果使用不经验证的表单,轻则会有大量无效提交 ...
- bat判断ini文件内容
@echo off for /f "tokens=1" %%d in (config.ini) do ( if /I "%%d" equ "path= ...
- SVN设置必须锁定
SVN是一个开放源代码的版本控制系统,相信做开发的基本上都用过,这里就不多介绍了.团队协作开发时常常会出现提交的文档互相冲突的问题,这里给大家介绍一下给SVN文件设置必须锁定的方法,当然你也可以对冲突 ...
- insmod 时报错“Unknown symbol”问题的解决
在加载驱动模块时报错: “ Unknown symbol CFG80211_SupBandReInit (err 0)” 查看了内核代码以及加载上的symbol(命令为 cat /proc/kalls ...
- mysql数据库基于LVM快照的备份
lvm-snapshot: 基于LVM快照的备份 1.事务日志跟数据文件必须在同一个卷上 2.创建快照卷之前,要请求mysql的全局锁,在快照创建完成之后释放锁 3 ...
- 【转载】如何让图片按比例响应式缩放、并自动裁剪的css技巧
原文: http://blog.csdn.net/oulihong123/article/details/54601030 响应式网站.移动端页面在DIV CSS布局中对于图片列表或图片排版时, 如果 ...
- 深入浅出 JavaScript 关键词 -- this
深入浅出 JavaScript 关键词 -- this 要说 JavaScript 这门语言最容易让人困惑的知识点,this 关键词肯定算一个.JavaScript 语言面世多年,一直在进化完善,现在 ...
- nginx配置学习总结
1.nginx反向代理 在讲诉具体的配置之前,先说下正向代理与反向代理的区别. 正向代理:是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理 ...
- LeetCode(37): 每k个一组翻转链表
Hard! 题目描述: 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一 ...