JavaScript中的对象

ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值、对象或者函数。”严格来讲,这就相当于说对象是一组没有特性顺序的值。对象的每一个属性或方法都有一个名字,而每个名字都映射到一个值。正因为这样(以及其他将要讨论的原因),我们可以把ECMAScript的对象想象成散列表:无非就是一组名值对,其中值可以使数据或函数。

new创建对象的步骤

使用new操作符创建对象会经历的4个步骤

1.创建一个新对象;

2.将构造函数的作用域赋给新对象

3.执行构造函数中的代码

4.返回新对象

模式一

简单工厂模式:

 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;
}

优点:解决了创建多个相似对象,代码重复的问题;

缺点:没有解决对象识别的问题(即怎样知道一个对象的类型);

模式二

构造函数模式:

 function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=function(){
alert(this.name);
};
}

优点:可以把实例识别为一种具体的类型;

缺点:每个方法都要在每个实例上重新创建一遍;

模式三

原型模式:

 function Person(){
}
Person.prototype.name="Nicholas";
Person.prototype.age=29;
person.prototype.job="Software Engineer";
Person.prototype.sayName=function(){
  alert(this.name);
};

优点:可以让所有对象实例共享它所包含的属性和方法;

缺点:原型的共享本质,使所有实例共享相同属性值,对于引用类型的属性来说,改变一个实例的属性值会导致所有实例属性发生改变;

重点知识点:实例中的指针仅指向原型,与构造函数无关;

模式四

组合使用构造函数和原型模式(目前定义引用类型的一种默认模式):

 function Person(name,age,job){
  this.name=name;
  this.age=age;
  this.job=job;
  this.fridends=["Shelby","Court"];
} Person.prototype={
  constructor:Person,
  sayName:function(){
    alert(this.name);
  }
}

风格缺点:没有把所有信息封装在构造函数中,格式上没有封装性;

模式五

动态原型模式(保证了封装性):

 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);
    };
  }
}

注意:使用动态原型模式时,不能使用对象字面量重写原型。如果在已经创建了实例的情况下重写原型,那么就会切断现有实例与新原型之间的关系;

模式六

寄生构造函数模式:

 function Person(name,age,job){
  var o=new Object();
  o.name=name;
  o.age=age;
  o.job=job;
  o.sayName=function(){
    alert(this.name);
  };
  return o;
}

知识点:构造函数在不返回值的情况下,默认会返回新对象实例。而通过在构造函数的末尾添加一个return语句,可以重写调用构造函数时的返回值。

用处:因为原则上不应改变原生对象的原型,因此可以用此方法为已存在的对象(Array,String等)添加特殊方法
缺点:和工厂模式没有本质区别,无法用instanceof操作符确定对象类型

模式七

工厂方法模式:

相比于简单工厂,工厂方法即提供了对象的类型,又很容易创建大量对象,即每增加一个对象只需要修改一处。举例:

 var Factory=function(type,content){
  if(this instanceof Factory){
    var s=new this[type](content);
    return s;
  }else{
    return new Factory(type,content);
  }
} Factory.prototype={
  Java:function(content){
    //......
  },   JavaScript:function(content){
    //......
  }
}

JavaScript创建对象的方法汇总的更多相关文章

  1. javascript创建对象的方法--原型模式

    javascript创建对象的方法--原型模式 一.总结 1.原型模式解决内存浪费的方法(继承):通过继承,对象继承原型模式下的所有属性,对象不同于其它对象的的属性自己创建或者修改 2.原型的使用(p ...

  2. javascript创建对象的方法--基本模式

    javascript创建对象的方法--基本模式 一.总结 关注本质 二.代码 <!DOCTYPE html> <html lang="zh-cn"> < ...

  3. javascript创建对象的方法--动态原型模式

    javascript创建对象的方法--动态原型模式 一.总结 1.作用:解决组合模式的属性和函数分离问题  2.思路:基本思路和组合模式相同:共用的函数和属性用原型方式,非共用的的函数和属性用构造函数 ...

  4. javascript创建对象的方法--组合模式

    javascript创建对象的方法--组合模式 一.总结 0.作用:解决原型模式对象独有属性创建麻烦的问题 1.组合模式使用普遍:jquery就是用的组合模式,组合模式使用非常普遍 2.组合模式优点: ...

  5. javascript创建对象的方法--构造函数模式

    javascript创建对象的方法--构造函数模式 一.总结 构造函数模式作用和不足 1.作用:解决工厂模式不是用new关键字来创建对象的弊端 2.作用:解决工厂模式创建的实例和模型没有内在联系的问题 ...

  6. javascript创建对象的方法--工厂模式(非常好理解)

    javascript创建对象的方法--工厂模式(非常好理解) 一.简介 创建对象的方法 本质上都是把"属性"和"方法",封装成一个对象 创建对象的基本模式 普通 ...

  7. JavaScript Array 数组方法汇总

    JavaScript Array 数组方法汇总 1. arr.push() 从后面添加元素,返回值为添加完后的数组的长度 var arr = [1,2,3,4,5] console.log(arr.p ...

  8. web前端教程之javascript创建对象的方法

    今天给大家讲讲javascript基础教程中的javascript面向对象的技术,这一次我们深入的学习一下JavaScrip基于t面向对象之创建对象,关于面向对象的一些术语这里就不给大家介绍了,不了解 ...

  9. javascript创建对象的方法总结

    Javascript创建对象 最简单的方法:创建object实例. var person=new Object(); person.name="Joey";person.age=2 ...

随机推荐

  1. 1.5sleep()方法

    方法sleep()的作用是指在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)这个正在执行的线程是指this.currentThread()返回的线程. 测试如下 package com.cky.t ...

  2. 配置React的Babel 6和Webpack 2环境

    Facebook的一帮子工程师在忙碌之余开发除了一套前段UI框架React.这个框架最大的有点就在于让UI的开发都基于组件,这样View都是根据props和state变化的. 项目地址:https:/ ...

  3. MapReduce、Hadoop、PostgreSQL、Spark

    分布式数据库 操作指令 如何实现云计算?注:GIS数据集 谷歌集群系统主要包括三个部分:分布式文件系统GFS,分布式并行计算模型map/reduce,以及分布式数据库Bigtable hadoop是g ...

  4. Installing Apache Hadoop Single Node

    转载请注明出处:http://www.cnblogs.com/wubdut/p/4681286.html platform: Ubuntu 14.04 LTS hadoop 1.2.1 1. inst ...

  5. python常用算法题

    一: #计算平均数,中位数和众数 #coding:utf-8 #计算平均数,中位数和众数 import random lst = [random.randint(0,10) for i in rang ...

  6. Javaweb异常提示信息统一处理

    Java异常封装(自己定义错误码和描述,附源码) 2016年01月29日 22:30:54 小宝鸽 阅读数:23262 标签: java异常 更多 个人分类: Java基础 所属专栏: Java工作实 ...

  7. java的并发和多线程

    本文主要讲解Java并发相关的内容,包括锁.信号量.堵塞队列.线程池等主要内容. 并发的优点和缺点 在讲述怎么利用多线程的情况下,我们先看一下采用多线程并发的优缺点. 优点 提高资源利用率 如读取一个 ...

  8. 初始MapReduce

    MapReduce 概述 MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用"的核心框架 MapReduce核心功能是将用户编写的业务逻辑代码和自带 ...

  9. [ 9.11 ]CF每日一题系列—— 441C暴力模拟

    Description: n * m 的地图,建设k个管道管道只能横竖走,且长度大于等于2,问你任意一种建设方法 Solution: 图里没有障碍,所以先把前k - 1个管道每个分2个长度,最后一个管 ...

  10. 如何判断ScrollView滑动方向

    1/判断滚动视图左右滚动 { CGFloat startContentOffsetX;//滚动开始的坐标 CGFloat willEndContentOffsetX; //滚动即将停止的坐标 CGFl ...