转载:http://blog.sina.com.cn/s/blog_60f632050100wz7h.html

(1)基于已有对象的扩充方法:适用于临时构建对象,弊端:每次构建对象都要新建一个。

  1. var object=new Object();
  2. object.name="Tom";
  3. object.sayname=function(name)
  4. {
  5. this.name=name;
  6. alert(this.name);
  7. }
  8. object.sayname("James");

(2)工厂方法 :可以重复返回多个对象。

  1. function createObject(){
  2. var object=new Object();
  3. object.username="Tom";
  4. object.password="123";
  5. object.get=function(){
  6. alert(this.username+","+this.password);
  7. }
  8. return object;
  9. }
  10. var o1=createObject();
  11. var o2=createObject();
  12. o2.username="james";
  13. o1.get();
  14. o2.get();

工厂方法的改进:

因为js的函数定义是指向一个应用的对象,所以每次构建一个object对象,都会构建一个get方法的对象,现在将get方法分离,那么就是多个object对象共用一个get对象,这样就可以节省内存空间。改进如下:

  1. function get(){
  2. alert(this.username+","+this.password);
  3. }
  4. function createObject(username,password){
  5. var object=new Object();
  6. object.username=username;
  7. object.password=password;
  8. object.get=get;
  9. return object;
  10. }
  11. var o1=createObject();
  12. var o2=createObject();
  13. o1.get();
  14. o2.get();

(3)构造方法创建对象:

  1. <span style="white-space:pre">    </span>function getInfo(){
  2. <span style="white-space:pre">        </span>alert(this.username+","+this.password);
  3. <span style="white-space:pre">    </span>}
  4. function Person(username,password){
  5. //在执行第一行代码前,js引擎会生产一个对象。即浏览器
  6. this.username=username;
  7. this.password=password;
  8. this.getInfo=getInfo;
  9. //此处隐含了一个return object的语句。
  10. }
  11. //只有在使用new Person();才会有上述Person中注释出现的情况,如果不适用new语句是不会          //成功的。
  12. var person=new Person("Tom","abc");
  13. person.getInfo();
  14. var person2=new Person("Jame","123");
  15. person2.getInfo();

(4)原型方法:(prototype)
因为js的所有类都是继承Object,Object中有prototype属性,因此自定义的对象也有prototype属性:如下

  1. function Person(){}
  2. Person.prototype.username="Tom";
  3. Person.prototype.password="1325";
  4. Person.prototype.getInfor=function(){
  5. alert(this.username+" , "+this.password);
  6. }
  7. var person=new Person();
  8. var person2=new Person();
  9. person.username="James";
  10. person.getInfor();
  11. person2.getInfor();

这种方法的缺点就是不能传递参数,只能在创建后修改属性。另外使用这种方法定义的对象都贡献同样的属性,因为他们都共用了object对象中的prototype对象,所以所有的对象贡献原型中的属性,其中一个更改了属性,也会反映到其他对象中去。

为了解决原型方法中对象贡献属性,可以采用构造方法+原型的方法去构建对象。把属性用构造方法定好。具体方法就用原型设置。
如下:

  1. <script type="text/javascript">
  2. function  Person(password){
  3. this.username=new Array();
  4. this.password=password;
  5. }
  6. Person.prototype.getInfo=function(){
  7. alert(this.username+","+this.password);
  8. }
  9. var p1=new Person("abc");
  10. p1.username.push("Tom");
  11. p1.getInfo();
  12. </script>

(5)动态原型的方法:

    1. function Person(username,password){
    2. this.username=username;
    3. this.password=password;
    4. if( typeof Person.first=="undefined" ){//通过设置标志量让getInfo只生成一次对象。
    5. alert("invoke");
    6. Person.prototype.getInfo=function(){
    7. alert(this.username+" , " +this.password);
    8. }
    9. Person.first=true;
    10. }
    11. }
    12. var p1=new Person("Tom","123");
    13. var p2=new Person("James","abc");
    14. p1.getInfo();
    15. p2.getInfo();

js中定义对象的几种方式的更多相关文章

  1. JavaScript学习12 JS中定义对象的几种方式

    JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工 ...

  2. JavaScript学习12 JS中定义对象的几种方式【转】

    avaScript学习12 JS中定义对象的几种方式 转自:  http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象. ...

  3. (六)javascriptJS中定义对象的几种方式(转)

    JavaScript学习12 JS中定义对象的几种方式 转自:  http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象 ...

  4. JS中访问对象的两种方式区别

    可以使用下面两种方式访问对象的属性和方法 1.对象名.属性名 对象名.方法名() 2.对象名["属性名"] 对象名["方法名"]() var obj = { n ...

  5. JavaScript中定义对象的四种方式

    最近在阅读< JavaScript 高级程序设计>,未免遗忘读过的内容,就打算以博客的形式做些读书笔记.今天介绍的是 JavaScript 中的四种定义对象的方法,除了这四种方法,还有工厂 ...

  6. js中定义变量的三种方式const,val,let 的区别

    js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始化. 1 const b = 2;//正确 2 // const b;//错误,必须初始 ...

  7. JS中定义对象和集合

    在js中定义对象: 方式一: var obj = {}; obj['a']=1; obj['b']=2; 方式二: var obj=new Object(); obj.a=1; obj.b=2; 在j ...

  8. js中声明Number的五种方式

    转载自:http://www.jb51.net/article/34191.htm <!DOCTYPE html> <html> <head> <meta c ...

  9. JS中事件绑定的三种方式

    以下是搜集的在JS中事件绑定的三种方式.   1. HTML onclick attribute     <button type="button" id="upl ...

随机推荐

  1. 一步一步从原理跟我学邮件收取及发送 3.telnet命令行发一封信

    首先要感谢博客园管理员的及时回复,本系列的第二篇文章得以恢复到首页,这是对作者的莫大鼓励.说实在的本来我真的挺受打击的.好在管理员说只是排版上有些问题,要用代码块修饰下相关的信息.说来惭愧因为常年编码 ...

  2. ucosii --任务就绪表

    任务就绪表的任务就是高效的找出当前优先级最高的就绪任务. 由任务就绪表OSRdyTbl和任务就绪组OSRdyGrb组成,OSRdyTbl每一个位都记录着一个任务的就绪状态, 0非就绪1就绪,OSRdy ...

  3. [国嵌攻略][159][SPI子系统]

    SPI 子系统架构 1.SPI core核心:用于连接SPI客户驱动和SPI主控制器驱动,并且提供了对应的注册和注销的接口. 2.SPI controller driver主控制器驱动:用来驱动SPI ...

  4. Web前端性能优化——如何提高页面加载速度

    前言:  在同样的网络环境下,两个同样能满足你的需求的网站,一个"Duang"的一下就加载出来了,一个纠结了半天才出来,你会选择哪个?研究表明:用户最满意的打开网页时间是2-5秒, ...

  5. 客户端怎么查看SVN的代码库

    安装SVN客户端,比如TortoiseSVN,然后将代码库checkout到本地,或者通过客户端的版本库浏览器直接连接SVN服务器查看代码库的目录结构. 如果SVN服务器端安装的时候是和Apache集 ...

  6. dede表前缀不定时,查询表#@__archives

    $query = "SELECT arc.*,tp.typedir,tp.typename,               tp.isdefault,tp.defaultname,tp.nam ...

  7. 从#65279字符看dede模板页面编码问题

    今天一位朋友让帮忙给解决一个dede模板的问题,问题主要是:模板文件生成html文件之后会在body开头处加入一个可见的控制符&#65279,导致页面头部会出现一个空白行. 接到"& ...

  8. 使用 IDEA和Maven 整合SSH框架

    1.创建web工程 一路next 下去就行.完成后,IDEA会自动构建maven工程. 2.创建如下项目结构 需要将 java文件夹设置为SourcesRoot目录,否则无法创建package 设置操 ...

  9. 通过EXPLAIN分析低效SQL的执行计划

    explain select * from film where rating>9\G; select_type 表示select的类型 SIMPLE 代表简单表,不用表连接或子查询 PRIMR ...

  10. linux_网站计量单位

    IP 独立IP数,是不同IP地址的计算机访问网站时被计算的总次数,独立IP数是衡量网站流量的一个重要指标,一般一天内相同IP地址的客户端访问网页只被计算为一次,记录独立IP的时间为一天或一个月,目前通 ...