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。
相关文章
- Object类中equals,hashCode和toString方法的学习
- Java中Object类的equals()和hashCode()方法深入解析
- 【JavaScript】19_面向对象中的方法和构造函数
- JavaScript中的一些特殊数值和方法
- 如何在javascript中创建数组的方法作为对象的属性?
- BX9029: IE 和 Firefox 可以通过特定方法使 innerHTML 方法载入的 SCRIPT 标签中的 JavaScript 代码在页面加载后也可
- JavaScript中事件和属性有什么区别吗?或者说事件与方法有什么区别?
- JavaScript中的window.close在FireFox和Chrome上不能正常动作的解决方法
- 深入理解JavaScript中的属性和特性
- javascript中apply()和call()方法的区别