JavaScript 中 Object ,Prototype 相关的属性和方法
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。
作者:
JiayangShen
水平有限,文中错误不妥在所难免,欢迎批评指正建议评论。文章将不定期修改完善斧正。转载请注明出处,谢谢!