对象 - 自定义对象 ¶
作者:KK
发表日期:2016.2.21
前面介绍了一些JS自带的全局对象,这回教你怎么创建自己的对象,首先对象的特征就是typeof(对象变量)
得到的结果就是object
这个字符串结果,就是一个类型名称,翻译过一就是"对象"
我们这回自己创建对象,最简单的办法就是var a = new Object();
这样,将new Object()
赋值给一个变量,那么这个变量就是一个对象,你自己typeof一下看看是不是object
注意开头的O是大写的字母O哦,不然要是工作2年后你还写成小写的object
就算我饶了你,面试官都打死你
可是这个对象目前是一个空的对象,它没有什么实用的方法(也有一些默认自带的方法,但这个基础教程就不解释太多啦)
我们要为它增加方法其实也很简单,来例子:
var myObj = new Object();
myObj.sayHello = function(){
alert('hello');
};
myObj.sayHello();
myObj.age = 88; //增加age属性
alert(myObj.age); //88
myObj.age = 99; //就算已经有了属性,都可以重新赋值或者重新计算,比如自增运算 myObj.age++
alert(myObj.name); //undefined 因为我们没有为myObj添加name属性,所以这个属性是"未定义"的(undefined)
第2行代码中为myObj对象增加了一个叫做sayHello
的属性,这个属性是一个匿名函数,当属性值为函数时,这个属性就变成了方法,所以可以执行myObj.sayHello()
进行方法的调用
花括号语法 ¶
自定义对象不一定要new Object(),而是可以用一种花括号语法来,很简单:var myObj = {};
这样就行了,跟new Object的效果是一样的
并且这个花括号也能生两行写
var myObj = {};
var myObj2 = {
//中间可以写点什么...下面再说
};
然后在花括号里面可以预先定义这个对象的属性和方法:
var myObj = {
name : '小明'
};
这样就定义了myObj对象,并且有一个name属性,属性值是字符串"小明",属性名称和属性值之间用一个:
号隔开,:号左右有没有空格都可以,我个人认为这样的代码比较整洁,不拥挤,所以就加了空格,并且加很多个空格也可以的...只是没那个必要
如果要增加方法,只要将值写成函数就可以了
var myObj = {
sayHello : function(){
alert('hello!');
}
};
其实函数也是值的一种,sayHello就是一个属性,由于值是一个函数,所以它个属性可以用函数语法来执行myObj.sayHello()
,所以又称为方法,反正以后我们都把能执行的函数属性叫做方法了,外界也是这么叫的
当一次性声明多个属性或者方法时,在值的后面加个逗号,继续写一个属性名称,再加:号隔开又写一个值就可以,例子:
var myObj = {
属性名称1 : '属性值1',
属性名称2 : function(){
alert('属性值2是一个函数,又叫方法');
},
属性名称3 : '属性值3', 属性4 : 444 //可以写在同一行,反正只要有符号隔开就行,不管你怎么分行,隔多少行
};
myObj.属性名称2();
并且在以后的文章中,我都是用花括号语法的哦,人懒嘛,呵呵~~~
自我引用this
¶
对象的方法可以使用自己的属性值,使用this对象来代表自己,作为自己的引用,先看代码
var myObj = {
name : '小明',
sayName : function(){
alert('我的名字叫做' + this.name); //this.name就是自己这个对象的name属性
alert('当前执行的方法代码是\n' + this.sayName); //字符串知识点的章节有提到 \n 是一个转义字符,表示换行
}
};
但是有个运行规则,当this写在哪个函数里,那么this就是指谁,上面的代码中,this写在一个匿名函数里,这个匿名函数是sayName的值,而sayName又属于myObj,所以this指的是myObj
然而如果sayName里又有函数,这个函数里有this就不是指myObj了,先看代码:
var myObj = {
name : '小明',
sayName : function(){
function xxx(){
alert(this.name); //undefined
}
xxx();
}
};
因为xxx里的this是指xxx函数自己,这种现象被业界称为this飘移
,再来代码:
var myObj = {
name : '小明',
sayName : function(){
function xxx(){
this.name = 'xxx的name值'; //临时创建name属性
alert(this.name); //xxx的name值
}
xxx();
}
};
所以并不能读取到myObj外面的name属性,要绕一下弯来实现,办法就是把myObj的this引用保存到一个变量里,再通过这个变量访问name属性
var myObj = {
name : '小明',
sayName : function(){
var self = this;
function xxx(){
alert(self.name); //小明
}
xxx();
}
};
自定义对象实际上起到什么作用? ¶
不同的对象有不同的功能,但JS中并不是所有存在的对象都能满足你快速建立你需要的功能
有时候需要你创建自定义对象来补充功能,下面我创建一个叫做"广告"的对象,它的作用是构造一个每2秒切换广告图片的广告区域,并且只有3张广告图轮流换
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>设计一个 广告 对象</title>
<script type="text/javascript">
var Banner = {
bannerCount : 0,
buildScope : function(wrapId, img1Url, img2Url, img3Url){
var bannerWrapId = 'bannerScope' + + this.bannerCount;
var bannerHtml = '<div id="' + bannerWrapId + '"></div>';
var bannerWrap = document.getElementById(wrapId); //通过指定的ID取得广告外框
if(bannerWrap == null){
alert('坑,你给我的外框咋找不到咧');
return;
}
bannerWrap.innerHTML = bannerHtml;
var lastBanner = '';
//这个函数用来切换广告图
function switchBanner(){
var showBanner = '';
if(lastBanner.length == 0 || lastBanner == img3Url){
showBanner = img1Url;
}else if(lastBanner == img1Url){
showBanner = img2Url;
}else{
showBanner = img3Url;
}
document.getElementById(bannerWrapId).innerHTML = '<img src="' + showBanner + '">';
lastBanner = showBanner;
}
switchBanner(); //先切换一次,将第一张图显示出来
setInterval(switchBanner, 2000);
this.bannerCount++;
}
};
function buildBanner(divId){
var imgUrl = 'http://' + document.domain + '/it/demo/js/banner/';
if(divId == 'div1'){
Banner.buildScope(
divId,
imgUrl +'1.jpg',
imgUrl +'2.jpg',
imgUrl +'3.jpg'
);
}else if(divId == 'div2'){
Banner.buildScope(
divId,
imgUrl +'4.jpg',
imgUrl +'5.jpg',
imgUrl +'6.jpg'
);
}else if(divId == 'div3'){
Banner.buildScope(
divId,
imgUrl +'7.jpg',
imgUrl +'8.jpg',
imgUrl +'9.jpg'
);
}
}
</script>
</head>
<body>
<div id="div1"></div>
<br/><br/>
<div id="div2"></div>
<br/><br/>
<div id="div3"></div>
<button type="button" onclick="buildBanner('div1');">向div1构造广告位</button>
<button type="button" onclick="buildBanner('div2')">向div2构造广告位</button>
<button type="button" onclick="buildBanner('div3')">向div3构造广告位</button>
</body>
</html>
我这个例子做得不是很好,所以大家可能通过以上代码还是不能完全了解自定义对象的好处,其实就像自定义函数差不多,但是对象会好一些
继续前进,慢慢接触的应用多了就能感受多了,至少你要知道怎么自定义一个对象