在这个看脸的世界,该如何优雅的创建JS对象
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!")
}
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);
数次地调用这个函数,而每次它都会返回一个包含两个属性一个方法的对象。
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);
- (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
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);
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对象的更多相关文章
- 【Unity3D】Unity3D开发《我的世界》之二、创建一个立方体
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/unity_minecraft_02.html 这一篇的内容比较简单,因为所有理论内容都在上一篇中讲到了.但有两点需 ...
- 且看一文梳理VS2019中dll的创建使用
动态链接库(dll) Windows下有静态链接(lib)库和动态链接库(dll)两种共享代码的方式. 本文将介绍dll的应用场景,以及在vs2019平台下的生成和使用. 今天的笔记内容说的是平时经常 ...
- 前端知识杂烩(Javascript篇)
1. JavaScript是一门什么样的语言,它有什么特点?2.JavaScript的数据类型都有什么?3.请描述一下 cookies,sessionStorage 和 localStorage 的区 ...
- Android Studio 单刷《第一行代码》系列 03 —— Activity 基础
前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...
- RecyclerView 和 ListView 使用对比分析
原文地址:http://blog.coderclock.com/2016/08/08/android/RecyclerView%20%E5%92%8C%20ListView%20%E4%BD%BF%E ...
- 让 Logo "飞" 出屏幕
让 Logo "飞" 出屏幕 推荐序 本文介绍了一种思路,即利用矢量工具来生成动画的关键代码,然后进一步制作成完整的动画效果,感谢作者授权转载. 作者介绍:一缕殇流化隐半边冰霜 ...
- hdu 5073 Galaxy(2014 鞍山现场赛)
Galaxy Time Limit: 2000/1000 MS (J ...
- Android RecyclerView与ListView比较
RecyclerView 概述 RecyclerView 集成自 ViewGroup .RecyclerView是Android-support-V7版本中新增的一个Widgets,官方对于它的介绍是 ...
- Python爬虫之抓取豆瓣影评数据
脚本功能: 1.访问豆瓣最受欢迎影评页面(http://movie.douban.com/review/best/?start=0),抓取所有影评数据中的标题.作者.影片以及影评信息 2.将抓取的信息 ...
随机推荐
- 软媒魔方 v6.2.1.0 绿色纯净版及经典版
软媒魔方,最好用的 Windows 系统增强软件!从最早的优化大师发展为一款系统超级增强套装,自动化.智能化解决各种电脑问题.软媒魔方,全新一代Windows系统增强辅助工具,智能+专业双操控模式,系 ...
- Mvc视图引擎、寻址规则
目前MVC中用的较多的视图引擎应该是WebFormViewEngine和RazorViewEngine了. 一个Request请求首先会进入Routing进行判断,对于错误的url是不能被路由匹配到的 ...
- 7.Android开源项目WheelView的时间和地址联动选择对话框
类似WheelView的时间和地址联动选择对话框在现在App经常看到,今天小结下. 主布局界面: <LinearLayout xmlns:android="http://schemas ...
- NodeJs + mongodb模块demo
代码比较通俗易懂,但是我还是在这个过程中浪费了不少时间,也算是看到了nodejs中异步的一个小坑.未来的坑还有很多,慢慢找坑填坑吧. 参考资料如下: 1.断言模块 : https://nodejs.o ...
- 介绍编译的less的两种IDE工具
介绍编译的less的两种IDE工具 现在css预编译越来越普及了,著名的有less.sass.stylus等等等等.功能上基本上都是大同小异.这些个玩意儿主要表达的意思就是:"像编程一样的编 ...
- WPF面试准备
1.wpf中有两类模板,控件模板controltemplate和datatemplate都派生自Frameworktemplate. 总共有三大模板 ControlTemplate,ItemsPane ...
- 20145212&20145204信息安全系统实验五
一.实验步骤 1.阅读理解源码 进入/arm2410cl/exp/basic/07_httpd目录,使用 vim编辑器或其他编辑器阅读理解源代码. 2.编译应用程序 运行 make 产生可执行文件 h ...
- SH Script Grammar
http://linux.about.com/library/cmd/blcmdl1_sh.htm http://pubs.opengroup.org/onlinepubs/9699919799/ut ...
- tamtam-nuget-imageserver
https://bitbucket.org/tamtam-nl/tamtam-nuget-imageserver/src/eaddb1ac943fcaa9e7ef210ed5a5ccf630b8699 ...
- [NHibernate]Parent/Child
系列文章 [Nhibernate]体系结构 [NHibernate]ISessionFactory配置 [NHibernate]持久化类(Persistent Classes) [NHibernate ...