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把对象定义为:“无序属性的集合,其属性可以包含基本值.对象或者函数.”严格来讲,这就相当于说对象是一组没有特性顺序的值.对象的每一个属性或方法都有一个名字 ...
随机推荐
- 我的Mac软件集
哥总算用上了mac,走上了小康了 phpstorm:个人工作中最常用的软件了 pycharm:这个写python的,和phpstorm是一家开发的 sourceTree:git 可视化工具 xcode ...
- ubuntu12.04 安装 php5.4/php5.5
1:修改源(我使用163的源)直接修改/etc/apt/sources.list deb http://mirrors.163.com/ubuntu/ precise main universe re ...
- 实例讲述PHP面向对象的特性;;;php中const与define的使用区别
php中const与define的使用区别 1.const:类成员变量定义,一旦定义且不能改变其值. define:定义全局常量,在任何地方都可以访问.2.define:不能在类中定义,而const可 ...
- 解决微软的两个恶心问题(VS2008死机、Win2008 WAS无法启动)
1.Visual Studio 2008,在切换到Web设计界面或Html Markup界面时,过一段时间就出现假死,点击任何地方没反应,也关闭不了,只能用任务管理器结束任务. 上网查了下,应该是先装 ...
- [LeetCode]题解(python):053-Maximum Subarray
题目来源 https://leetcode.com/problems/maximum-subarray/ Find the contiguous subarray within an array (c ...
- windows下memcache安装及配置
1.安装memcached服务,链接为http://i.cnblogs.com/Files.aspx, 下载解压后放在一个文件夹下,在开始搜索中输入cmd, 进入cmd黑框,cd 路径,进入memca ...
- 还原ORACLE DUMP 的值
还原DUMP出来的数字SQL> select dump(2000,16) from dual; DUMP(2000,16)------------------Typ=2 Len=2: c2,15 ...
- python笔记 - day5
python笔记 - day5 参考: http://www.cnblogs.com/wupeiqi/articles/5484747.html http://www.cnblogs.com/alex ...
- LED_9261在linux2.6.30中tick_led的实现
在linux2.6.30内核中,内核也提供了相关的平台驱动来操作gpio或LED,但更简便的方法是直接操作GPIO来控制led. 网上一博文中介绍直接封装led_on和led_off()函数直接调用即 ...
- [地图代数]处理DEM中的高程异常值——ArcGIS栅格计算的应用
接了一个任务,要处理DEM原始数据中的高程异常值,如图中的异常亮点. 想了一下,以前处理过建筑物附近的DEM铲平,那么高程异常值应该如何处理呢? 显然直接铲平时不太合理的,需要利用异常值周围的高程进行 ...