舒适提示:做者的爬坑记录,对你等大神彻底没有价值,别在我这浪费生命javascript
首先,说实话,我对不起javascript,做为一个接触前端快10年的老前端(伪),一直发扬的是不求甚解的拿来就用主义。
看着别人写的功能对,就直接拿过来用,写出来的代码臃肿到爆炸,满屏幕的jquery的初级使用方式,运气好了能凑合跑起来,出了问题全脸懵逼,心中安慰本身一万遍我但是干设计的,可是既然打算好好整下js就得从头开始看了。前端
但愿可以从源头制止一些错误的发生java
既然从头来,那我就来从新审视一下面相对象程序基础的基础:建立对象
因而又看了成吨博文
JavaScript中的对象,如何建立对象,建立对象的7种模式 - 旗smile
JS中建立对象的几种经常使用方法 - ifcode
ECMAScript 定义类或对象 - w3school(深度好文,强烈推荐)jquery
没有对象,本身造一个不就行了 --某资深黑魔法师前辈程序员
这是最简单的创造对象的方式,简单到只有一句话程序员
var girlFriend = {};
搓搓手,下一步咱们给她添加些属性和方法,让她看上去更真实(有意义)函数
girlFriend.name = "REI"; girlFriend.moeType = "silent"; girlFriend.hairColor = "blue"; girlFriend.sayHello = function(){ return "..." }
咱们也能够用一种更直接可读性更强的方式来建立this
var girlFriend = { name : "REI", moeType : "silent", hairColor : "blue", sayHello : function(){ return "..." } }
至此一个相对完整的对象就建立出来了,咱们能够随意的查看她的内部属性调用其内部方法.net
console.log(girlFriend.name)//REI console.log(girlFriend.sayHello)//...
这种方式的优势在于简单直接,便于理解,缺点在于只能建立单个对象(你还想怎样),每每在咱们的应用/后宫中,须要创造多个实例对象,这也就是面向对象/后宫漫的意义不是吗设计
对于上面那个危险的想法,咱们的思路是若是生成对象,能像执行函数那样,传入不一样的参数自动生成不通的实例对象,哪岂不是十分方便,而事实上咱们也是这么作的
最简单的想法,就是将咱们上面的方法封装成一个函数3d
function GirlFriend(name,moeType,hairColor){ var girlFriend = {}; girlFriend.name = name; girlFriend.moeType = moeType; girlFriend.hairColor = hairColor; girlFriend.sayHello = function(){ return moeType == 'silent'?"..." : "Ohayo!" } return girlFriend; } var rei = GirlFriend("Rei","silent","blue"); var asuka = GirlFriend("Atsuka","genki","red"); console.log(rei.sayHello());//... console.log(asuka.sayHello());//Ohayo!
结果若是咱们所见,咱们建立了两个不一样的对象实体,她们有着相同的属性名称可是确有不一样的属性值,这就是坊间所说的工厂模式
回头想一想虽然咱们成功的建立了两个对象实例,可是这两个对象是没法被做为girlFriend
对象来识别的,由于她们本就是在一个函数内部执行的过程当中被创造出来的,之间并不存在什么联系,这在开发中并不利于咱们追根溯源,不信咱们来看看
console.log(rei instanceof GirlFriend);//false
整这么半天,生成的Rei根本就不是girlFriend,只是看上去像而已/复制品
那咱们换一种思路,既然js中函数皆对象,能不能有这么一个函数/对象,他自己能够传入参数,而后以他自己为模版创造出相同类型的实例对象呢,js中就提供了一种特殊的函数,叫作构造函数,他的任务就是根据咱们的要求/传的参数,创造出和本身类型相同的的对象,而这种建立方法这就是坊间传说的构造函数法
GirlFriend = function(name, moeType, hairColor) { this.name = name; this.moeType = moeType; this.hairColor = hairColor; this.sayHello = function() { return moeType == 'silent' ? "..." : "Ohayo!" } }
这就是一个构造函数了,对他的使用就如同咱们在调用许多被封装好的js库同样,其实都是按照本身的需求实例化js库做者提早定义好的对象(这只是一个说话,构造函数中并无对象)
具体的方法以下
var rei = new GirlFriend("Rei", "silent", "blue"); var asuka = new GirlFriend("Atsuka", "genki", "red"); console.log(rei.sayHello());//... console.log(asuka.sayHello());//Ohayo!
构造函数是一种特殊的函数,须要配合new
来使用,在使用new
运算符时执行了如下步骤
1.建立一个新的对象
2.将构造函数做用域赋给新的对象(即this指向新对象,只有经过this才能访问)
3.执行构造函数里面的代码
4.返回新的对象
部分引自js工厂模式、构造函数以及他们建立对象的优缺点?— 第6.2.1节 - flyingpig2016
回过头来检查如下
console.log(rei instanceof GirlFriend);//true console.log(asuka instanceof GirlFriend);//true
这回ok了,Rei和Asuka妥妥的都是girlFriend了
固然,这种建立模式,还存在一些问题,而且还有其余的建立模式,放在下一篇博文中继续踩坑啦
能看到这里都明白的估计是个死宅了