开这个专栏,是想记录下我学习的历程,埋之前走过的坑,整理下思路,或许也还可以帮助到其他人。
然而从创建到现在,每次想写些东西,打开专栏,先写几句扯皮的话,然后呆坐半个小时,发现自己还有很多没有弄懂的地方,于是关掉网页,草稿都不要了。
就这样连续废了三次。终于今天听老师讲了对象原型,之前看书看出来的种种疑惑稍微明朗,赶紧记录下来先,不管对错与否,不然又要鸽。以下纯属个人理解,如有误请指正~
要开始了哦
首先是对象的声明。
我们都知道,没有对象是非常不好的,要有对象,首先要相亲声明一个变量。这里列举三个比较常用的声明方式。
1、直接创建:
var obj = new Object();
obj.属性名 = 值;
obj.方法名 = function(){就是函数的写法}
或者
var obj = {};
obj.属性名 = 值;
obj.方法名 = function(){还是函数的写法}
或者直接在{}里面加
var obj = {属性名1:值,属性名2:值,方法名:function(){这里不讲函数怎么写}}
//格式为{}括起来,名字和值用“:”隔开,各个属性用“,”隔开
//当然可以在外面继续加属性
obj.属性名N = 值;
ok,应该没什么错误吧没检查心虚
2、工厂模式
第一次见到这个这个名字,心里想的是:这是什么鬼名字!
然而一天后我就接受了……
具体来说,是在函数中创建一个对象,然后把这个对象作为返回值赋值就好了。
比如说
function createObj(name,value){ //写个函数,把声明挑出来
var obj = new Object(); //要用到new Object();
obj.name = name;
obj.value = value;
obj.方法名 = function(){函数的写法}
return obj; //把创建的obj作为返回值
}
var objName = createObj(参数1,参数2);
应该是这样写吧,var objName = new createObj(1,2);少个new或多个new貌似无影响。
这样写的好处是可以多次调用,不用每次都写一串的值了。然而!有个问题是,无法应用原型的属性(至少我现在还没发现有方法能用,等啥时候能用了再补怀疑态度)
3、构造函数
这个方法是我最喜欢的方法,既可以用原型,看起来也舒服简便。通过与原型的配合使用,还可以形成大家说的第四种方法混合模式白眼,然而我不想分那么细,就这么一块说了吧!
因为构造函数纯粹是为了定义对象的,于是它一定会指向一个对象(要是非要把它当函数用我也木得刚),于是可以用this这个神奇的字符来指向调用它的对象,也就是我们想要创建的对象!好绕口
具体来说,是这样的:
function CreateObj(name,value){ //也可以不传参数,创建了后再赋值,可那样多麻烦啊
this.name = name;
this.value = value;
this.方法 = function(){又是一个函数}
}
var objName = new CreateObj();
//权威指南上说,通常把前面要用new的函数命名为第一个首字母大写,方便辨识
//这个习惯是要推荐的
差不多就这样,接下来将原型,第四种第五种创建方法暂时不表~
原型的个人理解
前方口胡高能,望大神指正!
我觉得,原型这个词翻译的不是很好,以我对字面上的理解,“原型”嘛,像初号机那样,要先于后面量产的机型出现,然后量产机仿照原型来制造,也导致量产机根本就是渣,一点进步都没有,最后还得靠初号机来收人头(大雾)。
然而实际上在js里,原型并不是要先声明,也不必独立出来,甚至相反,它存在于对象“里面”。
“原型”实际上是指各个对象之间通用的部分,“公共对象”、“通用对象”、“公用部分”、“通用部分”之类的词可能会更好些个人理解。
也就是说,如果设置了原型,相同原型的对象就有了共同的部分。
既然是对象的一部分,那原型是一个对象(对象的一部分还是对象嘛,不过要先创建)。
经过我的试验,对象实例(也就是创建的有名称有值不是虚的是具体的能拿来用的对象比如obj1={value:1}这样的)和构造函数可以加原型,工厂函数不可以,其他的还没试,等下一篇文章再补充。
添加原型的方法是用prototype这个词(找不到形容这个词的概念了,方法、变量什么的太容易引起混淆,就用这个词吧!),这个prototype是一个对象……吧应该,我理解的是,它是对象中的对象。
用个例子来演示一下原型的好处,用构造函数为例:
function CreateObj(name,value){ //先写个构造函数压压惊
this.name = name;
this.value = value;
this.方法 = function(){因为我懒不想写函数好吧,想名字很难的}
}
var obj1 = new CreateObj("第一个",1); //用构造函数创建一个对象
var obj2 = new CreateObj("第二个",1); //用构造函数创建另一个对象
这样我们就获得了两个对象实例
那么现在问题来了,我们在之后的编码过程中,发现他们有共同的属性value,而且这两个值总是相等的,好在我们现在只有两个,要修改起来还算容易。
obj1.value = 2;
obj2.value = 2;
再后来,我们创建了好多好多的对象,他们都有个value值,而且都相等
var obj3 = new CreateObj("第三个",2);
var obj4 = new CreateObj("第四个",2);
var obj5 = new CreateObj("第五个",2);
…………………………
var objn = new CreateObj("第n个",2);
我们想改一下他们的value这个属性,由于创建的太多了,改起来简直是个灾难只要功夫深铁杵磨成针
于是为了应对这种情况发生,把value设置成通用的属性不就好了!由于大家都是调用的CreateObj这个构造函数(这里构造函数的好处就显现了,工厂模式无法添加原型!),那就给CreateObj这个函数添加个原型(通用属性),以后大家调用的时候,就能有个通用的属性了!重新写是这样的:
function CreateObj(name){ //构建函数
this.name = name;
}
CreateObj.prototype = {value:1};
//之前说过,prototype是个对象,对象的创建方式是怎样,它就能怎么写(吧……)
var obj1 = new CreateObj("第一个");
var obj2 = new CreateObj("第二个");
.......
var objn = new CreateObj("第n个");
//objn.value 有值了
这么一来,我们就可以直接修改这么多对象的通用部分了,通过修改
CreateObj.prototype.value = 2;
来修改所有对象的value值,是不是很爽!
先写这么多,还有继承等内容,容我再研究研究,纯属个人理解,如有误请及时指正!也是在帮助我~谢谢您的支持!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。