1、使用Object或对象字面量创建对象

  (1)使用Object创建对象

var cat= new Object();
cat.name = "Tom";
cat.color= "blue";

  (2)对象字面量创建对象

     

var cat = {
name : "Tom",
color : "blue"
};

  局限性:当需要创建n个同类重复对象时,需要重复代码n次。

2、工厂模式创建对象

  通过普通函数将对象的创建过程封装起来,给出特定的接口来初始化对象。

 function genCat (name,color){
var obj = new Object();
obj.name=name;
obj.color=color;
return obj;
}; var cat1 = genCat("Tom","blue");
function genDog (name,color){
var obj = new Object();
obj.name=name;
obj.color=color;
return obj;
}; var dog1 = genDog("Snoopy","white");

  局限性:对于这种工厂方法创建出来的对象,我们无法得知对象具体属于哪一类。如上述代码中的cat1和dog1,如果使用instanceof去检测,会发现cat1和dog1都属于Object类型。而我们的初衷是希望cat1属于Cat类,dog1属于Dog类。

3、构造函数模式创建对象

 function Cat (name,color){
this.name=name;
this.color=color;
this.yell=function(){
return this.name + 'mew!';
}
}; var cat1 = new Cat("Tom","blue");
function Dog (name,color){
this.name=name;
this.color=color;
this.yell=function(){
return this.name + 'bark!';
}
}; var dog1 = genDog("Snoopy","white"); alert(cat1 instanceof Cat); //true
alert(dog1 instanceof Cat); //false
alert(cat1 instanceof Dog); //false
alert(dog1 instanceof Dog); //true

   通过构造函数创建出的对象如上述代码可知,解决了对象类型归属的问题,能够明确检测对象属于哪一具体类型。

    局限性:通过构造函数创建对象时,当一个构造函数被实例化n次时,构造函数中的函数也被实例化了n次,如上述代码中的this.yell(),同一类型的不同对象之间并不共用同一函数,造成了内存的浪费。

4、原型模式创建对象

  我们创建的每一个函数都有一个prototype属性,该属性是一个指针,该指针指向了一个对象。对于我们创建的构造函数,该对象中包含可以由所有实例共享的属性和方法。

  在默认情况下,所有原型对象会自动包含一个constructor属性,该属性也是一个指针,指向prototype所在的函数。

  在调用构造函数创建新的实例时,该实例的内部会自动包含一个[[Prototype]]指针属性,该指针指便指向构造函数的原型对象。

  

  通过在构造函数原型对象中添加属性和方法就可以实现在对象间数据的共享了。

 function Cat(){
}; Cat.prototype.name="Tom";
Cat.prototype.color="blue";
Cat.prototype.yell=function(){
return this.name + "mew!";
}; var cat1= new Cat();
var cat2= new Cat();
alert(cat1.yell() == cat2.yell()); //true 两者共享同一函数

  局限性:原型对象实现了对象间属性的共享,但在通常情况下我们希望不同的实例拥有自己单独的属性。所以一般情况下,我们使用构造函数模型和原型模型结合使用创建对象,就可以兼得方法的共享和属性的不共享。

 //每只猫有自己的名字和颜色
function Cat(name,color){
this.name = name;
this.color = color;
}; //所有的猫都共享一个yell()方法
Cat.prototype.yell=function(){
return this.name + "mew!";
}; var cat1= new Cat("Tom","blue");
var cat2= new Cat("Garfield","yellow"); alert(cat1.yell()); //Tom mew! 实例属性
alert(cat2.yell()); //Garfield mew! 实例属性 alert(cat1.yell() == cat2.yell()); //true 两者共享同一函数

[JavaScript]对象创建方法的更多相关文章

  1. Javascript对象的方法赋值

    Javascript对象编程学习中,一直不能很好的掌握对象的属性(property)和方法(method).今天在写代码过程中,又犯了一个低级错误. <!DOCTYPE html> < ...

  2. 3种创建、调用JavaScript对象的方法

    hey you guys,两个月没有写技术博客了.作为一名有理想.有抱负的程序员,两个月不写技术博客,真该打.业精于勤,荒于嬉.行成于思,毁于随.勤奋是必不可少的,今后养成一周至少一篇博客的习惯.好了 ...

  3. js中对象和对象创建方法

    这一次我们来说一说在JavaScript中经常会用到的一个复杂基本类型,对象,先从对象的属性讲起,再讲对象的创建方法,基本涵盖了创建对象的各种方法,大家一起学习呀~ 一.对象 要掌握对象的使用及继承, ...

  4. 【JavaScript学习】JavaScript对象创建

    1.最简单的方法,创建一个对象,然后添加属性 var person = new Object(); person.age = 23; person.name = "David"; ...

  5. 深入JavaScript对象创建的细节

    最近深入学习javascript后,有个体会:面向对象的方式编程才是高效灵活的编程,也是现在唯一可以让代码更加健壮的编程方式.如果我们抛开那些玄乎的抽象出类等等思想,我自己对面向对象的从写程序的角度理 ...

  6. JavaScript 对象创建

    tips: JavaScript 除了null和undefined之外,其他变量都可以当做对象使用. JavaScript 的基本数据类型有:number boolean string null  u ...

  7. JavaScript对象创建的几种方式

    1 工厂模式 1.1 创建 function createFruit(name,colors) { var o = new Object(); o.name = name; o.colors = co ...

  8. javascript对象与方法

    对象与方法 一.数组(Array) 1.使用new关键字创建数组 var box = new Array();                                     //创建了一个数 ...

  9. Javascript 对象创建多种方式 原型链

    一.对象创建 1.new Object 方式 直接赋上属性和方法 var obj = new Object(); obj.name = '娃娃'; obj.showName = function(){ ...

随机推荐

  1. Redis配置文件的使用

    Redis基本配置 常规配置 进到配置文件下 vi /etc/redis.conf 写入配置项 port 1111 # 配置端口号 daemonize yes # 是否后台运行 daemonize y ...

  2. 002-docker安装-mac上安装docker,17.06在CentOS7 64位机器上安装

    一.mac上安装docker 1.下载 通过这个链接下载:https://download.docker.com/mac/stable/Docker.dmg 2.安装 将 Moby 的鲸鱼图标拖拽到  ...

  3. Redis持久化方式RDB和AOF

    Redis 持久化 RDB(快照) 优点 rdb是可进行压缩的二进制文件,表示Redis在某一个时间点的数据快照.非常使用与备份,灾难恢复等场景.比如使用定时任务执行bgsave并备份rdb到serv ...

  4. html当前文档的状态

    <script type="text/javascript"> document.onreadystatechange = loadingChange;//当页面加载状 ...

  5. HDU1158:Employment Planning(线性dp)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1158 这题又是看了题解,题意是一项工作需要n个月完成,雇佣一个人需要m1的钱,一个人的月工资为sa,辞退一 ...

  6. Django-进阶之路--信号

    Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...

  7. LocalReport Print with C# C#打印RDLC

             {             ;                                                      )             {        ...

  8. Java架构搜集

    1. 2.

  9. 什么是jstack

    以下是百度百科的内容 jstack是java虚拟机自带的一种堆栈跟踪工具. jstack用于生成java虚拟机当前时刻的线程快照.线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成 ...

  10. linux 相关使用总结

    1. 在centos下安装g++,如果输入 yum install g++,那么将会提示找不到g++.因为在centos下g++安装包名字叫做:gcc-c++ 所以应该输入 yum install g ...