2009年7月24日 星期五

javascript(4) - Object


object的建立可以透過JSON format或者new()兩種方式:
var e = {};
var p = {x:10, y:20};
var name;
for (name in p) {
   alert('p.' + name + '=' + p[name]);
}

透過new可以建立新的object(呼叫constructor進行初始化),比如new Object(),會建立一個empty object(constructor為{})。可以透過.或者[]存取object的properties,透過delete移除object的properties。用var宣告的properity不能被delete。
var person = new Object();
person.name = "Brook";
person.age = 30;
person['weight'] = 50;
alert(person['name']);
alert(person.age);
alert(person.weight);
delete person.weight;
alert(person.weight);

檢查property是否存在
var p = {x:10, y:20};
if ('x' in p) alert('p has property "x"');
if ('y' in p) alert('p has property "y"');
if ('z' in p) alert('p has property "z"');

constructor()
類似C++/JAVA的constructor function。
function Animal() {
}
var bird = new Animal();
alert(bird.constructor == Animal);
alert(bird.constructor == Object);  

toString()
每當object要被需要被轉成string時會被呼叫。

valueOf()
每當object需要被轉成primitive type時會被呼叫。

hasOwnProperty()
用以判斷object是否有自己定義properties。

Array
Array算是一種特別的Object,可以透過.或[]存取element。要移除element必須用shift()/pop()/splice()不能用delete。
var a1 = new Array();
a1[0] = "hello";
a1.x = "xx";
alert(a1['x']);
alert(a1[0]);

var a2 = [];
for (var i = 1; i < 10; i++) {
  a2[i] = i*i;
}
a2.shift(); // remove first element
a2.pop(); // remove last element.
alert(a2);
a2.splice(5);
alert(a2);
a2['x'] = 'xx';
a2['y'] = 'yy';
alert(a2.length);
a2.length =3;
alert(a2);
a2.length = 5;
alert(a2);
Array.length回傳的是目前用的index最大值+1,index最大值為2^32-1,因此length並不保證有這麼多element,而直接改變index會造成Array的truncating和enlarging。

JavaScript並不支援multi-dimensional array,但是允許element可以是array(array本來就是object的一種)。
var t = new Array(3);
for (var i = 0; i < t.length; i++) {
  t[i] = new Array(5);
}

for (var r = 0; r < t.length; r++) {
  for( var c = 0; c < t[r].length; c++) {
    t[r][c] = r * c;
  }
}
alert(t);

Array.join()
將所有的element轉成string之後串在一起。
var a = new Array(1,2,3);
var b = new Array(3);
alert(a.join());
alert(b.join());

Array.reverse()
將所有element順序反轉(reverse the order)。
var a = new Array(1, 2, 3);
alert(a.reverse().join());

Array.sort()
將所有element做排序,可以給sort一個compare function進行排序。
var a = new Array(3, 1, 2);
alert(a.sort().join());
alert(a.sort(function(a, b) { return b - a; }).join());

Array.concat()
將回傳新的Array,包含新的element加上原本array中的element(不會改變原本的array)。
var a = new Array(1, 2, 3);
var a1 = a.concat(4,[5]); // [1, 2, 3, 4, 5]
alert(a1);
var a1 = a.concat([4, [5]]); // [1, 2, 3, 4, [5]]
alert(a1);

Array.slice()
回傳新的Array(不改變原來的array),包含指定的(satrt, end]之element。
var a = new Array(1, 2, 3, 4, 5);
alert(a.slice(1));
alert(a.slice(2,3));
alert(a.slice(-1));
alert(a.slice(-2, 3));
alert(a.slice(2, -3));
alert(a.slice(-2, -3));

Array.splice()
用於insert/remove element。
var a = new Array(1, 2, 3, 4, 5);
a.splice(4);
alert(a);
a.splice(2, 1);
alert(a);
var a = new Array(1, 2, 3, 4, 5);
a.splice(4);
alert(a);
a.splice(2, 1);
alert(a);
var a1 = a.splice(1,2, 'a', 'b'); /* a[1]開始, 取代後面2個, 為'a', 'b' */
alert(a);
alert(a1);
a1 = a.splice(1,0, 'a', 'b'); /* a[1]開始, 取代0個(insert的意思), 為'a', 'b' */
alert(a);
alert(a1);

Array.push()/Array.pop()
從Array後面新增/刪除。
var a = [];
alert(a.push('a'));
alert(a.push('b'));
alert(a.pop());
alert(a.pop());

Array.unshift()/Array.shift()
從Array前面新增/刪除。
var a = [];
alert(a.unshift('a'));
alert(a.unshift('b'));
alert(a.shift());
alert(a.shift());

global/call object
當JavaScript一啟動後,便會建立global object,而所有的全域變數/全域函數都是這個global object的屬性,當呼叫另外一個function時,就會建立call object,區域變數/內部函數也成為這個call object的屬性。

沒有留言:

張貼留言

熱門文章