Javascript是一门解释型的语言,是基于对象的,严格来说并不怎么符合的面向对象的标准,显著的特点就是函数就是“一等对象”,与传统的面向对象语言不同的时,Javascript有“一千种”方法来创建对象,(尽管猿们找个对象的方法基本为零)。《Js高程》为我们讲解了多种创建对象的方法,这些方法之间并没有优劣,只要在具体的环境下选择合适的方法即可。

1.对象字面量

 var mygirl={
name:"js",
age:"24",
shopping:function(){
console.log("give me money!")
}
}
小结:大括号里的键值对,只能创建一个特定的单例对象
 

2. Object构造函数

 var mygirl=new Object();
mygirl.name="js";
mygirl.age=24;
mygirl.shopping=function(){
console.log("give me money!")
}
小结:ES5新方法构建对象,再添加属性,还有一种常用的更简洁的方法
var mygirl={};
mygirl.name="js";
mygirl.age=24;
mygirl.shopping=function(){
console.log("give me money!")
}

3.工厂模式创建对象

function createMygirl(name, age)
{
var o =new Object();
o.name=name;
o.age=24;
o.shopping=function()
{
console.log("give me money!")
};
return o;
}
var mygirl=createMygirl("JS",24);
 
小结:函数 createMygirl() 能够根据接受的参数来构建一个包含所有必要信息的对象。可以无

数次地调用这个函数,而每次它都会返回一个包含两个属性一个方法的对象。

特点:可以创建多个相似对象的问题,但却没有解决对象识别的问题(即怎样知道一个对象的类型)。

4.自定义构造函数模式创建对象

function Girl(name, age)
{
this.name=name;
this.age=24;
this.shopping=function()
{
console.log("give me money!")
};
}
var mygirl=new Girl("JS",24);
var yourgirl=new Girl("HTML",23);
要创建 Girl 的新实例,必须使用 new 操作符。以这种方式调用构造函数实际上会经历以下 4个步骤:

  • (1) 创建一个新对象;
  • (2) 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象);
  • (3) 执行构造函数中的代码(为这个新对象添加属性);
  • (4) 返回新对象。

特点:实例上的同名函数不能共享,即

 alert(mygirl.shopping == yourgirl.shopping);//false
 

5. 使用原型模式创建对象

 function Girl(){
}
Girl.prototype.name="JS";
Girl.prototype.age=24;
Girl.prototype.friends=["girl1","girl2"];
Girl.prototype.shopping=function()
{
console.log("走起,闺蜜们"+this.friends);
//叫上闺蜜一起败家
};
var mygirl=new Girl();
mygirl.friends.push("girl3");
mygirl.shopping();//走起,闺蜜们girl1,girl2,girl3
var yourgirl=new Girl();
yourgirl.shopping();//走起,闺蜜们girl1,girl2,girl3
特点:原型中所有属性是被所有实例共享的,这种共享对于函数非常合适,但是对于基本属性就显得不是很合适,尤其是对于包含引用类型值的属性来说,问题就比较突出了。所有实例共享属性,如firends,这样mygirl添加的闺蜜,也会变成yourgirl的闺蜜。
 

6. 组合使用原型模式和构造函数创建对象(my beauty)

 function Girl(name, age)
{
this.name=name;
this.age=24;
this.friends=["girl1","girl2"];
}
Girl.prototype.shopping=function()
{
console.log("走起,闺蜜们"+this.friends);
//叫上闺蜜一起败家
};
var mygirl=new Girl("JS",24);
var yourgirl=new Girl("HTML",25);
mygirl.friends.push("girl3");
console.log(mygirl.friends);//[ 'girl1', 'girl2', 'girl3' ]
console.log(yourgirl.friends);//[ 'girl1', 'girl2' ]
console.log(mygirl.friends===yourgirl.friends);//false
console.log(mygirl.shopping===yourgirl.shopping);//true
特点:创建自定义类型的最常见方式,就是组合使用构造函数模式与原型模式。构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性。结果,每个实例都会有自己的一份实例属性的副本,但同时又共享着对方法的引用,最大限度地节省了内存。另外,这种混成模式还支持向构造函数传递参数;可谓是集两种模式之长。
 

7.动态原型模式

function Girl(name, age)
{
this.name=name;
this.age=24;
if(typeof this.sayName!="function"){
Girl.prototype.shopping =function(){
console.log("give me money!")
};
}
}
var mygirl=new Girl("JS",24);
mygirl.shopping();
特点:动态原型模式把所有信息都封装在了构造函数中,而通过在构造函数中初始化原型(仅在必要的情况下),又保持了同时使用构造函数和原型的优点。换句话说,可以通过检查某个应该存在的方法是否有效,来决定是否需要初始化原型。
 

8.寄生构造函数模式

function Girl(name, age)
{
var o =new Object();
o.name=name;
o.age=age;
o.shopping=function()
{
console.log("give me money!")
};
return o;
}
var mygirl=new Girl("kevin",24);
这个模式可以在特殊的情况下用来为对象创建构造函数。假设我们想创建一个具有额外方法的特殊数组。由于不能直接修改 Array 构造函数,因此可以使用这个模式。
functionSpecialArray(){
//创建数组
var values =newArray();
//添加值
values.push.apply(values, arguments);
//添加方法
values.toPipedString =function(){
returnthis.join("|");
};
//返回数组
return values;
}
var colors =newSpecialArray("red","blue","green")
alert(colors.toPipedString());//"red|blue|green"

9.稳妥构造函数模式

 function Girl(name, age,bestfriend)
{
//可以在这里定义私有变量和函数
var heigth=1.75;
var o =new Object();
o.shopping=function()
{
console.log("走起,闺蜜们"+bestfriend);
//叫上闺蜜一起败家
};
return o;
}
var mygirl=Girl("kevin",24);
 

特点:一是新创建对象的实例方法不引用 this;二是不使用 new 操作符调用构造函数。在以这种模式创建的对象中, 除了使用 shopping() 方法之外,没有其他办法访问 bestfriend 的值(闭包)。

在这个看脸的世界,该如何优雅的创建JS对象的更多相关文章

  1. 【Unity3D】Unity3D开发《我的世界》之二、创建一个立方体

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/unity_minecraft_02.html 这一篇的内容比较简单,因为所有理论内容都在上一篇中讲到了.但有两点需 ...

  2. 且看一文梳理VS2019中dll的创建使用

    动态链接库(dll) Windows下有静态链接(lib)库和动态链接库(dll)两种共享代码的方式. 本文将介绍dll的应用场景,以及在vs2019平台下的生成和使用. 今天的笔记内容说的是平时经常 ...

  3. 前端知识杂烩(Javascript篇)

    1. JavaScript是一门什么样的语言,它有什么特点?2.JavaScript的数据类型都有什么?3.请描述一下 cookies,sessionStorage 和 localStorage 的区 ...

  4. Android Studio 单刷《第一行代码》系列 03 —— Activity 基础

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  5. RecyclerView 和 ListView 使用对比分析

    原文地址:http://blog.coderclock.com/2016/08/08/android/RecyclerView%20%E5%92%8C%20ListView%20%E4%BD%BF%E ...

  6. 让 Logo "飞" 出屏幕

    让 Logo "飞" 出屏幕   推荐序 本文介绍了一种思路,即利用矢量工具来生成动画的关键代码,然后进一步制作成完整的动画效果,感谢作者授权转载. 作者介绍:一缕殇流化隐半边冰霜 ...

  7. hdu 5073 Galaxy(2014 鞍山现场赛)

    Galaxy                                                                   Time Limit: 2000/1000 MS (J ...

  8. Android RecyclerView与ListView比较

    RecyclerView 概述 RecyclerView 集成自 ViewGroup .RecyclerView是Android-support-V7版本中新增的一个Widgets,官方对于它的介绍是 ...

  9. Python爬虫之抓取豆瓣影评数据

    脚本功能: 1.访问豆瓣最受欢迎影评页面(http://movie.douban.com/review/best/?start=0),抓取所有影评数据中的标题.作者.影片以及影评信息 2.将抓取的信息 ...

随机推荐

  1. jenkins持续集成源码管理选项为None,构建失败找不到git.exe解决办法

    我的jenkins版本为Jenkins ver. 2.19.1 1.源码管理选项只有None的解决办法: 在插件管理中心,搜索对应的源码管理插件这里以git为例,搜索git plugin点击右下角的安 ...

  2. 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  3. hihoCoder 后缀数组 重复旋律

    #1403 : 后缀数组一·重复旋律 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成 ...

  4. 深夜重温JavaScript中的对象和数组

    这一块实际上已经学过了,因为没有学好,在工作过程中遇到一些对象或者数组的操作,会去百度查找,浪费了许多宝贵的时间,所以特地再拐过头来重新学习. 对象 基本概念: 对象这种基本的数据结构还有其他很多种叫 ...

  5. JS-抽奖系统-实现原理

    有本事中奖的,过来找我换红包!!哈哈!! <meta charset="UTF-8"> <title>抽奖系统</title> <styl ...

  6. mysql-5.7日志设置

    环境 Windows10企业版X64 mysql安装目录:D:\mysql-5.7.15-winx64. 在mysql安装目录下手工新建一个log目录:mysql\log. mysql\my.ini内 ...

  7. jvm垃圾回收机制

    http://blog.csdn.net/zsuguangh/article/details/6429592 原文地址

  8. php常用字符串函数小结

    php内置了98个字符串函数(除了基于正则表达式的函数,正则表达式在此不在讨论范围),能够处理字符串中能遇到的每一个方面内容,本文对常用字符串函数进行简单的小结,主要包含以下8部分:1.确定字符串长度 ...

  9. nginx图片处理

    前言 不管一个系统或网站的大与小,都存在相应的图片处理,生成缩略图.为图片加水印等等,如果涉及到APP端,这个图片的处理需求变得更加重要了,因为在目前看来,客户端的屏幕大小不一,会导致以下问题: 1. ...

  10. MyEclispe发布web项目-遁地龙卷风

    (-1)写在前面 我用的是MyEclipse8.5. 还记得以前帮助一个女同学解决问题的时候,特意情调了要先启动服务在发布项目,其实单独的时候都是知道的,总和起来后就容易片面的给出结论.因为不会发生问 ...