JavaScript创建对象的写法


Posted in Javascript onAugust 29, 2013

对象是什么
从JavaScript定义上讲对象是无序属性的集合,其属性可以包含基本值、对象或函数。也就是说对象是一组没有特定顺序的属性,每个属性会映射到一个值上,是一组键值对,值可以是数据或对象。

最简单的对象
JavaScript的一对花括号{}就可以定义一个对象,这样的写法实际上和调用Object的构造函数一样

var obj={};
var obj2=new Object();

这样构建出来的对象仅仅包含一个指向Object的prototype的指针,可以使用一些valueOf、hasQwnProperty等方法,没有多大实际作用,自定义对象嘛总要有一些自定义的属性、方法神马的。

var obj={};
            obj.a=0;
            obj.fn=function(){
                alert(this);
            }            var obj2={
                a:0,
                fn:function(){
                    alert(this);
                }
            }

可以在定义完对象后通过”.”为其添加属性和方法,也可以使用字面量赋值方法在定义对象的时候为其添加属性和方法,这样创建的对象,其方法和属性可以直接使用对象引用,类似于类的静态变量和静态函数,这样创建对象有一个明显缺陷——在定义大量对象的时候很费力,要一遍遍的写几乎是重复的代码。

抽象一下
既然是重复代码就可以抽象出来,用函数来做这些重复工作,在创建对象的时候调用一个专门创建对象的方法,对于不同的属性值只需要传入不同参数即可。

function createObj(a,fn){
                var obj={};
                obj.a=a;
                obj.fn=fn;
                return obj;
            }            var obj=createObj(2,function(){
                alert(this.a);
            });

这样在创建大量对象的时候,就可以通过调用此方法来做一些重复工作了,这种方式也不完美,因为在很多时候需要判断对象的类型,上面代码创建出来的对象都是最原始的Object对象实例,只是拓展了一些属性和方法。

有型一些

又是function登场的时候,JavaScript中function就是个对象,在创建对象的时候打可以抛开上面createObj方法,直接使用function作为对象,怎么实现复用呢,这就在于function作为对象的特殊性了。

1. function可以接受参数,可以根据参数来创建相同类型不同值的对象

2. function作为构造函数(通过new操作符调用)的时候会返回一个对象,在贫下中农版jQuery中提到过一些构造函数的基本知识,简单复制一下

构造函数的返回值分为两种情况,当function没有return语句或者return回一个基本类型(bool,int,string,undefined,null)的时候,返回new 创建的一个匿名对象,该对象即为函数实例;如果function体内return一个引用类型对象(Array,Function,Object等)时,该对象会覆盖new创建的匿名对象作为返回值。

3. 那么使用function怎么解决类型识别问题呢,每个function实例对象都会有一个constructor属性(也不是“有”,而是可以对应),这个属性就可以指示其构造是谁,也可以使用instanceof 操作符来做判断对象是否为XXX的实例。

不能光说不练,上代码

function Person(name){
                this.name=name;
                this.fn=function(){
                    alert(this.name);
                }
            }            var person1=new Person('Byron');
            console.log(person1.constructor==Person);//true
            console.log(person1 instanceof Person); //true

这样就完美了吧,也不是!虽然构造函数可以是对象有型,但对象的每个实例中的方法都要重复一遍!

function Person(name){
                this.name=name;
                this.fn=function(){
                    alert(this.name);
                }
            }            var person1=new Person('Byron');
            var person2=new Person('Frank');
            console.log(person1.fn==person2.fn);//false

看看看,虽然两个实例的fn一模一样,但是却不是一回事儿,这如果一个function对象有一千个方法,那么它的每个实例都要包含这些方法的copy,很让内存无语啊。

不玩儿虚的了

究竟有没有一种近乎完美的构造对象的方式,及不用做重复工作,又有型,对象通用方法又不必重复?其实可以发现使用function已经距离要求和接近了,只差那么一点儿——需要一个所有function对象的实例共享的容器,在这个容器内存发实例需要共享的属性和方法,正好这个容器是现成的——prototype,不了解prototype的同学可以看看JavaScript prototype

function Person(name){
                this.name=name;
            }            Person.prototype.share=[];
            Person.prototype.printName=function(){
                alert(this.name);
            }
            var person1=new Person('Byron');
            var person2=new Person('Frank');
            console.log(person1.printName==person2.printName);//true

这样每个Person的实例都有自己的属性name,又有所有实例共享的属性share和方法printName,基本问题都解决了,对于一般的对象处理就可以始终这个有型又有爱的创建对象模式了。

Javascript 相关文章推荐
Jquery判断IE6等浏览器的代码
Apr 05 Javascript
JQuery入门——移除绑定事件unbind方法概述及应用
Feb 05 Javascript
php 中序列化和json使用介绍
Jul 08 Javascript
jquery带有索引按钮且自动轮播切换特效代码分享
Sep 15 Javascript
JavaScript读二进制文件并用ajax传输二进制流的方法
Jul 18 Javascript
使用jquery/js获取iframe父子级、同级获取元素的方法
Aug 05 Javascript
详解JavaScript中数组的reduce方法
Dec 02 Javascript
详解基于webpack和vue.js搭建开发环境
Apr 05 Javascript
JavaScript数据结构之广义表的定义与表示方法详解
Apr 12 Javascript
了解JavaScript函数中的默认参数
May 30 Javascript
jquery.tagsinput.js实现记录checkbox勾选的顺序
Sep 21 jQuery
echarts实现获取datazoom的起始值(包括x轴和y轴)
Jul 20 Javascript
jQuery实现用户注册的表单验证示例
Aug 28 #Javascript
Jquery实现显示和隐藏的4种简单方式
Aug 28 #Javascript
jQuery动画效果-slideUp slideDown上下滑动示例代码
Aug 28 #Javascript
jQuery动画效果-fadeIn fadeOut淡入浅出示例代码
Aug 28 #Javascript
Jquery 实现表格颜色交替变化鼠标移过颜色变化实例
Aug 28 #Javascript
Jquery仿淘宝京东多条件筛选可自行结合ajax加载示例
Aug 28 #Javascript
Jquery Uploadify多文件上传带进度条且传递自己的参数
Aug 28 #Javascript
You might like
一贴学会PHP 新手入门教程
2009/08/03 PHP
php实现随机显示图片方法汇总
2015/05/21 PHP
phplist及phpmailer(组合使用)通过gmail发送邮件的配置方法
2016/03/30 PHP
PHP模板引擎Smarty内建函数section,sectionelse用法详解
2016/04/11 PHP
php通过会话控制实现身份验证实例
2016/10/18 PHP
PHP实现将base64编码字符串转换成图片示例
2018/06/22 PHP
JCalendar 日历控件 v1.0 beta[兼容IE&Firefox] 有文档和例子
2007/05/30 Javascript
6种javascript显示当前系统时间代码
2015/12/01 Javascript
jQuery插件ajaxfileupload.js实现上传文件
2020/10/23 Javascript
Javascript获取background属性中url的值
2016/10/17 Javascript
js时间查询插件使用详解
2017/04/07 Javascript
AngularJS 实现购物车全选反选功能
2017/10/24 Javascript
vue中v-text / v-html使用实例代码详解
2019/04/02 Javascript
原生JS使用Canvas实现拖拽式绘图功能
2019/06/05 Javascript
JavaScript实现随机点名程序
2020/03/25 Javascript
解决Echarts 显示隐藏后宽度高度变小的问题
2020/07/19 Javascript
Vue 实现监听窗口关闭事件,并在窗口关闭前发送请求
2020/09/01 Javascript
JavaScript实现前端倒计时效果
2021/02/09 Javascript
python使用正则表达式分析网页中的图片并进行替换的方法
2015/03/26 Python
django反向解析和正向解析的方式
2018/06/05 Python
Python爬虫常用小技巧之设置代理IP
2018/09/13 Python
对Python3+gdal 读取tiff格式数据的实例讲解
2018/12/04 Python
python脚本调用iftop 统计业务应用流量的思路详解
2019/10/11 Python
解决tensorflow由于未初始化变量而导致的错误问题
2020/01/06 Python
python 数据库查询返回list或tuple实例
2020/05/15 Python
tensorflow实现残差网络方式(mnist数据集)
2020/05/26 Python
使用Html5实现异步上传文件,支持跨域,带有上传进度条
2016/09/17 HTML / CSS
印度购物网站:TATA CLiQ
2017/11/23 全球购物
师范大学音乐表演专业求职信
2013/10/23 职场文书
英语专业应届生求职信范文
2013/11/15 职场文书
师德师风个人反思
2014/04/28 职场文书
违反学校规则制度检讨书
2015/01/01 职场文书
2016大学军训心得体会
2016/01/11 职场文书
听课评课活动心得体会
2016/01/15 职场文书
如何使用Python对NetCDF数据做空间相关分析
2021/04/21 Python
SpringCloud Function SpEL注入漏洞分析及环境搭建
2022/04/08 Java/Android