日期:2014-05-16 浏览次数:20330 次
转自: http://blog.csdn.net/cj205/archive/2011/01/23/6159709.aspx
?
JavaScript对象及继承教程
?
一、 类与对象
在 JavaScript 世界里,关于面向对象第一个要澄清的概念就是类。对象都是有类来定义的,通过类来创建对象就是我们所熟悉的实例化。然而,在 JavaScript 中别没有真正的类,对象的定义就是对象自身。而 ECMA-262 干脆把这种妥协的方式称作为对象的调和剂。为了方便理解,我通常把这个发挥类的作用的调和剂称为类。
二、 内置对象
1、 Array类
数组在 js 中是非常常用的一种数据结构,由于其灵活性和易用性,合理的使用数组可以帮助我们更好的实现相应的功能。
让我们先看 Array 对象的创建吧
第一种:var arr = new Array(10);
该方法在实际的使用当中并不那么的实用,与很多编译型语言不同, js 数组的长度是可变的,不但增强了灵活性,还给我们有了更多好的选择。
第二种:var arr = new Array("one","two","three");
使用 new 方式创建数组的方法一般多为这两者,当然也可以使用 new Array() 创建一个空的数组对象。通常情况下,我推荐如下的方法
第三种:var arr = ["one","two","three"];
使用数组的字面量方式创建一个数组对象,不但简洁易读,而且几乎完全等价于使用 new 方式创建数组对象的效果。数组对象有很多好用的方法,接下来我们就一起看看这个数组对象的强大功能吧。
首先要介绍的是 push 方法,学过数据结构的朋友都知道 push 意味着什么,没错,他的出现让数组能够实现栈的数据结构(同时需要配合 pop 方法)。 push 方法帮助我们紧凑的添加数组元素。前面提到js中的数组是长度是可变的,则我们可以添加元素。既然可以通过 arr[length] = newValue; 来给 arr 添加一个新元素并放置于数组尾。更好的办法就是使用 push 方法。 arr.push(newValue); 怎么样,使用他比你还要通过数组长度来赋新值方便多了吧。在这里有一点需要注意。请看下面的代码:
var arr = [];
arr[4] = 5;
alert(arr.length == 5);
alert(arr); //alert : ,,,,5
当我们需要给指定数组位置赋予指定的值的时候,这种赋值就显得十分有用了,比如在用于装箱排序的时候。
pop 方法则是实现与 push 相反的作用,返回数组的最后一个元素,并出栈。
var arr = [1,2,3,4,5];
var ele = arr.pop();
alert(ele == 5);
alert(arr.length == 4);
数组对象的 toString 和 valueOf 方法比较人性化的重写了,它的实现是把每一项都调用 toString 方法,然后用半角逗号(,)连接每一项。那么:
var arr = [1,2,3,4,5];
alert(arr);//output:1,2,3,4,5
toLocaleString 方法在这里不做详细说明了,他的效果与 toString 方法类似,只是每项调用 toLocateString 方法。
如果你想使用个性化的分隔符来显示数组元素,那么 join 方法可能会更加的适合。比如:
var city = ["上海","北京","天津","重庆","深圳"];
alert(city.join("|"));//output:上海|北京|天津|重庆|深圳
由此可见 join 是把数组元素转换为一个字符串。在介绍字符串的时候我们将再次看到 join 方法的使用。
concat 方法和 slice 方法是又一对好用的方法,这两个方法的特殊之处在于 String 对象也拥有他们。当我们希望给一个数组添加多个数组元素的时候,使用 push 可能就显得有些冗余和复杂了,而且也会让 coding 变得不那么有意思了。好在我们有 concat 方法,该方法将其参数们按序加入数组元素中。如:
var arr = [1,2,3,4,5];
arr = arr.concat(6,7,8,9);
alert(arr.length == 9);
注意, concat 并不修改数组对象本身,而是将数组元素与 concat 方法的数组元素合并后返回。所以需要给数组元素进行赋值运算才行。
slice 方法则是从数组对象中返回一个子数组。该子数组是从 slice 方法的第一个参数所指位置至第二个参数所指的位置。这是一个半开半闭区间 [a,b) 。如:
var arr = [1,2,3,4,5];
var arr1 = arr.slice(1,3);
alert(arr1); //output:2,3
alert(arr); //output:1,2,3,4,5
好了, slice 和 concat 方法一样不是修改数组对象本身。同时参数1,3表示从位置1到位置3的半开半闭区间的子数组。
刚才讨论了后进先出的栈操作,现在我们来看看先进先出的队列操作吧。进列使用 push 方法没有问题,那么出列呢。是 shift ,他删除数组对象的第一个元素并返回:
var arr = [1,2,3,4,5];
var ele = arr.shift();
alert(ele); //output:1
alert(arr.length);//output:4
另外一个还有一个方法,叫 unshift ,他将新元素插入数组对象的第一项,究其功能与 shift 是相反的操作。
sort 方法很灵活,使用好了,他可以给数组元素以任意你想要的排序方式来进行排序。因为 sort 方法接收一个匿名函数(其实,它同样可以接收一个非匿名的函数,但是通常不推荐为此而创建一个这样的命名函数,除非该函数可重用)作为自己的排序的条件。比如:
Object.prototype.toString = function(){
var str = '';
for(var item in this) {
str += item + ":" + this[item] + ",";
}
return str.length?str.substr(0,str.length-1):str;
};
var arr = [{key:3,value:"three"},{key:1,value:"one"},{key:2,value:"two"}];
arr.sort(function(a,b){
return a.key - b.key;
});
alert(arr);//output:key:1,value:one,key:2,value:two,key:3,value:three
我们先不去纠结 Object.prototype.toString 方法,他的左右就是将对象遍历使之可以输出为键值对格式字符串,在介绍原型链的时候会再次提到。我们可以看到 sort 方法通过这个匿名方法让我们可以根据 key 属性来进行排序。那就让我们来看看这个匿名方法吧。
function(a,b) {
return a.key - b.key;
};
可以看到,这个方法接收2个参数,然后对参数的自身或某个属性进行比较,然后返回比较结果,他们的比较结果与排序对应关系如下:
如果 paramA - paramB > 0,return 正数 ,则 b 排在 a 的前面
如果 paramA - paramB < 0,return 负数 ,则 b 排在 a 的后面
如果 paramA - paramB = 0,return 0 ,则顺序不变。
上面的实现是顺序排序,那么 倒序 呢?对, return paramB - paramA;
reverse 方法可以将数组对象反转。他和 sort 方法一样是修改数组对象内部元素顺序的。
最