1.Objuect 類型
Object
類型是全部對象的基類型,能夠用
new
運算符產生一個
Object
類型。
開發者能夠經過產生
Object
類型的實例並向其動態添加屬性和方法來產生本身須要的
對象。如:
var
o
=
new
Object
();
ECMAScript
要求僅當構造函數須要參數時才須要括號,若是沒有參數,括號能夠省
略(不推薦這種作法)。如:
var
o
=
new
Object
;
//legal, but not recommended
每個
Object
類型的實例都有以下的屬性和方法:
constructor
--
產生對象所使用的函數。
hasOwnProperty
(
propertyName
)--
代表給定的屬性是否存在於對象的實例而非原
型上,propertyName
必須是一個字符串或字符串類型的變量。
isPrototypeOf
(
object
)--
檢查對象是不是參數對象實例的原型。
propertyIsEnumerable
(
propertyName
)--
代表參數所給定的屬性是否能夠在
for
-
in
語句中進行枚舉。參數必須是一個字符串或字符串變量。
toLocaleString
()--
返回一個本地化了的對象的字符串表示。
toString
()--
返回對象的字符串表示。
valueOf
()--
返回一個與對象相對應的字符串、數值或布爾值。一般與
toString
()
返回的結果是相同的。
由於在
ECMAScript
中,Object
是全部對象的基類型,因此,每個對象都擁有這些
基本的屬性和方法。可是,像
BOM
和
BOM
這些瀏覽器對象和文檔對象,他們的實現與宿
主環境有關,不受
ECMA
-
262
的制約,他們不必定是直接從
Object
所繼承而來。
2.原型(prototype)
每當一個函數產生時,它的
prototype
屬性也將根據某些特定的規則產生。默認狀況
下,全部的
prototype
自動地得到一個名稱爲
constructor
的屬性,該屬性指向以該原
型做爲屬性的函數。能夠用
isPrototypeOf
()
方法來判斷一個對象(類)是否爲某個對
象實例的原型。如:
alert
(
Person
.
prototype
.
isPrototypeOf
(
person1
));
alert
(
Person
.
prototype
.
isPrototypeOf
(
person2
));
ECMAScript
5
增長了一個叫作
Object
.
getPrototypeOf
()
的方法,該方法存在於
Object
類型上,能夠認爲是一個靜態方法。該方法用於得到一個對象實例的原型。支
持該方法的瀏覽器有
IE
9
+,
Firefox
3.5
+,
Safari
5
+,
Opera
12
+,
and
Chrome。
其用法如:
alert
(
Object
.
getPrototypeOf
(
person1
)
==
Person
.
prototype
);
alert
(
Object
.
getPrototypeOf
(
person1
).
name
);
3.實例屬性與原型屬性
當一個屬性被添加到對象的實例上後,該屬性會屏蔽在原型上與之同名的任何屬性
(但能夠經過實例的
prototype
訪問原型上的屬性)。對於實例上屬性的改變不會影
響到原型上相同名稱的屬性。
delete
運算符能夠刪除實例上的屬性,使得原型上相應的屬性能夠被直接訪問。
hasOwnProperty
()
方法能夠斷定一個屬性是存在於對象的實例上仍是原型上。該
方法繼承自
Object。僅當屬性存在於對象實例上時該方法返回
true,不然,返回
false。如:
alert
(
person1
.
hasOwnProperty
(
"name"
));
4.原型和 in 運算符
in
運算符有兩種使用方法:單獨使用或在
for
-
in
循環語句中使用。單獨使用
時,若是對象指定名稱的屬性能夠訪問,結果就是
true。這意味着,該屬性可能存在
於實例上,也多是存在於原型上。結合
hasOwnProperty
()
方法與
in
運算符能夠
斷定對象的屬性是否僅存在於原型上,如:
function
onlyHasPrototypeProperty
(
object
,
name
){
return
!
object
.
hasOwnProperty
(
name
)
&&
(
name
in
object
);
}
當在
for
-
in
語句中使用
in
運算符時,對象全部可訪問可枚舉的屬性都將被
返回,包括實例屬性和原型屬性。屏蔽原型上不可枚舉的實例屬性也將被返回,由於
開發者定義的屬性都是可枚舉的。但在
IE8
-
上倒是例外。如:
var
o
=
{
toString
:
function
()
{
return
"My Object"
;
}
};
for
(
var
prop
in
o
)
{
if
(
prop
==
「toString」
)
{
alert
(
"Found toString"
);
//won’t display in Internet Explorer
}
}
這使得在
IE8
-
上,全部
Object
上的屬性和方法都不能夠被枚舉。
5.對象屬性的枚舉
ECMAScript
5
提供一個
Object
.
keys
()
方法用於檢索對象上全部可枚舉的實例
屬性。它接受一個對象做爲參數,並返回一個字符串數組,包含全部檢索到的屬性的
名稱。如:
function
Person
()
{
}
Person
.
prototype
.
name
=
"Nicholas"
;
Person
.
prototype
.
age
=
29
;
Person
.
prototype
.
job
=
"Software Engineer"
;
Person
.
prototype
.
sayName
=
function
()
{
alert
(
this
.
name
);
};
var
keys
=
Object
.
keys
(
Person
.
prototype
);
alert
(
keys
);
//」name,age,job,sayName」
var
p1
=
new
Person
();
p1
.
name
=
"Rob"
;
p1
.
age
=
31
;
var
p1keys
=
Object
.
keys
(
p1
);
alert
(
p1keys
);
//」name,age」
getOwnPropertyNames
()
方法用於檢索對象全部可枚舉和不可枚舉的實例屬性。
var
keys
=
Object
.
getOwnPropertyNames
(
Person
.
prototype
);
alert
(
keys
);
//"constructor,name,age,job,sayName"
var
keys
=
Object
.
getOwnPropertyNames
(
p1
);
alert
(
keys
);
//"name,age"
for
(
var
prop
in
p1
)
{
alert
(
prop
);
//依次輸出:name,age,job,sayName
}
支持
Object
.
keys
()
和
Object
.
getOwnPropertyNames
()
方法的瀏覽器有
IE9
+,
Firefox
4
+,
Safari
5
+,
Opera
12
+,
和
Chrome。