javascript创建对象的方法总结
Javascript创建对象
最简单的方法:创建object实例。
var person=new Object();
person.name="Joey";
person.age=28;
person.sayName=function(){
alert(this.name);
};
或者使用字面量的形式会简洁一些
var person={
name:"Joey",
age:28,
sayName:function(){alert(this.name);}
};
缺点:如果要创建多个实例会产生大量重复代码,最好只用于创建单个对象。
工厂模式
ECMAscript中是没有类的,由于利用Obeject创建多个实例代码量太多,于是考虑使用一个函数将创建对象的过程封装起来。
function creatPerson(name,age){
var o=new Object();
o.name=name;
o.age=age;
o.sayName=function(){
alert(this.name)};
}
return o;
var person1=creatPerson("Joey",28);
var person2=creatPerson("Mary",20);
在creatPerson函数中,实例化了一个对象o,给了o三个属性(sayName属性对应的是一个函数)。通过传入函数的参数来为属性赋值,最终范围对象o,就像一个工厂,把原料(参数)投进去,内部进行赋值,然后把成品(对象o)返回给你。利用这种模式,可以直接调用该函数,控制不同的参数来创建许多相似的实例,非常方便。
缺陷:虽然工厂模式可以创建多个相似对象,可是没有解决对象识别的问题,在java/C#中,我们在通常会创建很多类,然后对操作不同的实例,然而在上述工厂模式中,无论定义多少个函数,实例化的对象都是Obeject类型。
构造函数模式
在var o=new Object();这个语句中,使用了new操作符调用了Object()构造函数创建了新的Object类型对象,那么我们能不能自定义构造函数来创建自定义类型的对象呢?
function Person(name,age){
this.name=name;
this.age=age;
this.sayName=function(){
alert(this.name);
};
}
var person1=new Person("Joey",28);
var person2=new Person("Mary",20);
这个例子中Person()函数取代了工厂模式中的creatPerson()函数,两者不同之处在于:
1.没有显式创建对象。
2.将属性和方法赋给了this对象。
3.没有return语句。
ps:在构造函数中的this指向全局对象(window)
当调用构造函数实例化对象时,必须使用new操作符,此时会经历以下步骤:
1.创建一个新对象。
2.将构造函数的作用域赋给新对象(此时this指向了这个新对象)。
3.执行构造函数中的代码(为新对象添加属性)。
4.返回新对象。
person1和person分别保存着Person的不同实例,这两个对象都有一个constructor(构造函数)属性,指向Person。constructor属性用来标识对象类型,如果要检测对象类型,可以使用instanceof操作符。
alert (person1 instanceof Object);//true
alert (person1 instanceof Person);//true
alert (person2 instanceof Object);//true
alert (person2 instanceof Person);//true
创建自定义构造函数意味着将来可以将它的实例标识为一种特定的类型;这正是构造函数模式的优点。
ps:person1和person2同时是Object的实例,是因为所有对象继承自Object。
构造函数虽然好用,但是也有缺点,使用构造函数的主要问题,就是每个方法要在每个实例上重新创建一遍。
alert(person1.sayName==person.sayName);//false
从上面的代码可以看出person1和person2中的sayName方法是不等的。
原型模式
每个函数都有一个prototype属性,指向一个对象,该对象包含可以由特定类型的所有实例共享的属性和方法。关于prototype在此将不详细叙述(复杂QWQ)
调用构造函数创建一个新实例之后,实例类部将包含一个指针_proto_指向构造函数的prototype对象,实现共享。
function Person()
{}
Person.prototype.name="Joey";
Person.prototype.age=28;
Person.prototype.sayName=function(){
alert(this.name);
};
var person1=new Person();
var person2=new Person();
person2.sayName();//"Joey"
person1.sayName();//"Joey"
上例写出了原型模式的基本用法,多用于共享属性和方法。
缺点:1.无法传递参数,所有实例获得的值都一样。
2.若共享的属性为引用类型,一旦改变一个实例中的引用类型值,会影响其他实例中的引用类型属性,这就是为什么很少单独使用原型模式的原因。
ps:若在实例中添加同名基本类型的值,会屏蔽原型中的对应属性。
最常用:组合模式
组合使用构造函数和原型模式来创建自定义类型。
构造函数用于定义实例属性,而原型模式用于定义方法和共享的属性。
function Person(name,age){
this.name=name;
this.age=age;
this.friends=["W","M"];
}
Person.prototype.sayName=function(){
alert(this.name);
};
var person1=new Person("Joey",28);
var person2=new Person("Mary",20);
person1.friends.push("van");
alert(person1.friends);//"Van","W","M"
alert(person2.friends);//"W","M"
alert(person1.sayName===person2.sayName);//true
上述代码中,构造函数模式中重复创建函数的缺点没有了,sayName()函数在原型中创建。引用类型则被声明在了构造函数里面,作为实例特有的属性,实例属性也可以利用参数传值进行初始化。
这是定义自定义类型,使用最广泛的方法,也是大家默认的一种模式。
javascript创建对象的方法总结的更多相关文章
- javascript创建对象的方法--基本模式
javascript创建对象的方法--基本模式 一.总结 关注本质 二.代码 <!DOCTYPE html> <html lang="zh-cn"> < ...
- javascript创建对象的方法--动态原型模式
javascript创建对象的方法--动态原型模式 一.总结 1.作用:解决组合模式的属性和函数分离问题 2.思路:基本思路和组合模式相同:共用的函数和属性用原型方式,非共用的的函数和属性用构造函数 ...
- javascript创建对象的方法--组合模式
javascript创建对象的方法--组合模式 一.总结 0.作用:解决原型模式对象独有属性创建麻烦的问题 1.组合模式使用普遍:jquery就是用的组合模式,组合模式使用非常普遍 2.组合模式优点: ...
- javascript创建对象的方法--原型模式
javascript创建对象的方法--原型模式 一.总结 1.原型模式解决内存浪费的方法(继承):通过继承,对象继承原型模式下的所有属性,对象不同于其它对象的的属性自己创建或者修改 2.原型的使用(p ...
- javascript创建对象的方法--构造函数模式
javascript创建对象的方法--构造函数模式 一.总结 构造函数模式作用和不足 1.作用:解决工厂模式不是用new关键字来创建对象的弊端 2.作用:解决工厂模式创建的实例和模型没有内在联系的问题 ...
- javascript创建对象的方法--工厂模式(非常好理解)
javascript创建对象的方法--工厂模式(非常好理解) 一.简介 创建对象的方法 本质上都是把"属性"和"方法",封装成一个对象 创建对象的基本模式 普通 ...
- web前端教程之javascript创建对象的方法
今天给大家讲讲javascript基础教程中的javascript面向对象的技术,这一次我们深入的学习一下JavaScrip基于t面向对象之创建对象,关于面向对象的一些术语这里就不给大家介绍了,不了解 ...
- JavaScript创建对象的方法
显示在浏览器中的控制台中. <script type="text/javascript"> //这个工厂方法返回一个新的"范围对象" functio ...
- JavaScript创建对象的方法汇总
JavaScript中的对象 ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值.对象或者函数.”严格来讲,这就相当于说对象是一组没有特性顺序的值.对象的每一个属性或方法都有一个名字 ...
随机推荐
- web项目中 集合Spring&使用junit4测试Spring
web项目中 集合Spring 问题: 如果将 ApplicationContext applicationContext = new ClassPathXmlApplicationContext(& ...
- php 通过exec 创建git分支失败
今天给我们自己的发布系统增加一个新建分支的功能,操作比较简单,但是使用php执行shell命令的时候总是无法push分支到远程,但是登陆服务器执行却是可以的 新建分支命令如下 git fetch -- ...
- 解读ClassLoader
ClassLoader一个经常出现又让很多人望而却步的词,本文将试图以最浅显易懂的方式来讲解 ClassLoader,希望能对不了解该机制的朋友起到一点点作用. 要深入了解ClassLoader ...
- 【Android测试】【第十四节】Appium——简述
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5124340.html 前言 同样的,这一篇我要介绍的也是一 ...
- js创建元素
js创建多条数据,插入到页面中的方法. 方法一: 执行时间大概在35ms左右. 这个就属于使用字符串拼接之后,再一次性的插入到页面中.缺点是,容易导致事件难以绑定. 方法二: 执行时间不定,最少的在8 ...
- 转:自定义ASP.NET MVC Html辅助方法
在ASP.NET MVC中,Html辅助方法给我们程序员带来很多方便,其重要性也就不言自明.有时候,我们不想重复地写一些HTML代码,或者MS没有提供我们想要的那个HTML标签的Html辅助方法,那么 ...
- RTSP交互命令简介及过程参数描述
目录 [hide] 1 RTSP消息格式 2 简单的rtsp交互过程 3 rtsp中常用方法 3.1 OPTION 3.2 DESCRIBE 3.3 SETUP 3.4 PLAY 3.5 PAUSE ...
- 常用 linux 命令(部分)
常用命令总结: 1. mkdir命令 mkdir dirname , 用来创建目录.该命令创建由dirname命名的目录.如果在目录名的前面没有加任何路径名,则在当前目录下创建由dirname指定的目 ...
- PySe-005-基础环境配置(Win7)
之前的文章讲述了如何在 MacOX 下配置 Python + Selenium2 的 WebUI测试自动化环境配置,敬请参阅 PySe-001-基础环境配置(MacOX). 此文主要讲述如何配置 Py ...
- Tomcat 处理请求时的中文乱码问题
利用Tomcat8作为服务器,采用servlet接收前端请求后进行处理的过程中,前台请求中有中文时,中文信息变成了乱码. 经过调试和查阅,发现Tomcat在处理get请求和post请求是有区别的.参照 ...