一、对象的简单操作
(一)对象的建立
1.通过var建立
var person={
name:'大青',
sex:'female',
age:16,
};
2.通过function建立
function PersonInfo(name,sex,age){
this.name=name;
this.sex=sex;
this.age=age;
}
var person=new PersonInfo('daqing','female',16);
注意:必须在PersonInfo前面加new
(二)对象的读取
1.直接读取
person.name或者Person['name']
2.通过其它赋值读取
key='name';
person[key]
此时用person.key读取是错误的
(三)对象属性的添加
person.addr='北京';
或者person['addr']='北京';
(四)对象属性的修改
person.addr='Beijing';
或者person.['addr']='Beijing';
(五)对象属性的删除
delete person.addr;
或者delete person['addr'];
(六)通过for/in遍历属性
for(x in person){
document.write(x+' : '+person[x]+'
');
}
结果为:
name : 大青
sex : female
age : 16
(七)对象中添加方法
var person={
sayhi:function(){
return 'hello,world!';
},
};
document.write(person.sayhi()+'
');
结果为:
hello,world!
(八)对象方法内的属性自调用
var person={
name:'大青',
sex:'female',
age:16,
sayhi:function(){
return 'hello,world!';
},
info:function(){
return 'name: '+this.name+'
'+'sex: '+this.sex
}
};
document.write(person.info()+'
');
结果为:
name: 大青
sex: female
二、对象的属性
(一)对象的原型
一般来讲,每个对象都有原型,对象的原型也是一个对象,对象可从对象的原型那里继承属性与方法,类似于Python中类的继承。例如:
function foo(){};
foo.prototype.z=3;
var obj=new foo();
document.write(obj.z+'
');
结果为:
3
obj自身没有属性z,但是obj继承foo()的原型(foo.prototype)的z属性。
原型的继承关系如下:obj==>foo.prototype==>Object.prototype==>null。注:Object对象是所有对象的父级对象。
若此时直接在obj上设置z属性,则obj.z访问的就是对象本身的属性,不是对象原型的属性,如:
function foo(){};
foo.prototype.z=3;
var obj=new foo();
document.write(obj.z+'
');
obj.z=5;
document.write(obj.z+'
');
结果为:
5
(二)检查对象是否有某属性
1.可用下面的方法,检查对象是否具有某属性:
'属性名' in obj
例如:
document.write('z' in obj);
结果为:
true
注意:若对象本身没有某属性,但对象的原型(或对象原型的原型...)拥有该属性,用此种方式判断,则结果仍然为true。例如:
function foo(){};
foo.prototype.z=3;
var obj=new foo();
document.write(('z' in obj)+'
');
document.write(('toString' in obj)+'
');
结果为:
true
true
2.若只想检测对象本身是否具有某属性,可使用hasOwnProperty方法,例如:
function foo(){};
foo.prototype.z=3;
var obj=new foo();
obj.x=1;
document.write(obj.hasOwnProperty('x')+'
');
document.write(obj.hasOwnProperty('z')+'
');
document.write(obj.hasOwnProperty('toString')+'
');
结果为:
true
false
false
因此,对于如下代码:
var obj=Object.create({x:1});
document.write(obj.hasOwnProperty('x')+'
');
document.write(('x' in obj)+'
');
结果为:
false
true
即可分析得出:通过Object.create()方法创建的对象,x不是obj本身的属性,而是obj原型的属性。
3.propertyIsEnumerable()方法
检测属性是否属于对象,若返回true,需要满足以下两个条件:
- 属性属于实例,不属于原型;
- 属性必须可枚举,即可用for...in循环遍历;
例如:
function Foo(){};
Foo.prototype.z=3;
var obj=new Foo();
obj.x=1;
document.write(obj.propertyIsEnumerable('x')+'
');
document.write(obj.propertyIsEnumerable('z')+'
');
输出为:
true
false
4.Object.getOwnPropertyNames()或Object.keys()
返回一个指定对象的所有自身属性的属性名组成的数组,区别是Object.getOwnPropertyNames()返回的属性包括不可枚举属性,而Object.keys()返回的属性只包括可枚举属性。
例子:
function Foo(){};
Foo.prototype.z=3;
var obj=new Foo();
obj.x=1;
obj.y=2;
obj['addr']='北京';
for(var p in obj){
console.log(p);
}
console.log(Object.getOwnPropertyNames(obj));
console.log(Object.keys(obj));
输出为:
x
y
addr
z
["x", "y", "addr"]
["x", "y", "addr"]
注意:for...in
输出了z
,其余两个方法没有输出z
。
(三)对象的属性特性
1.Object.defineProperty
Object.defineProperty(object, propertyname, descriptor)
参数:
object:必需。要在其上添加或修改属性的对象。这可能是一个本机 JavaScript 对象(即用户定义的对象或内置对象)或 DOM 对象。
propertyname:必需。一个包含属性名称的字符串。
descriptor必需。属性描述符。它可以针对数据属性或访问器属性。
- configurable:当且仅当这个属性描述符值为true时,该属性可能会改变,也可能会被从相应的对象删除。默认为false。
- enumerable:当且仅当属性值为true时,该属性可枚举。默认为false。
- value:与属性有关的值,可以是任何有效的JavaScript值。默认为undefined。
- writable:值为true时,能用运算符改变与属性相关的值。默认为false。
示例:
var obj={};
Object.defineProperty(obj,'x',{
value:12,
});
console.log(obj.x);
obj.x=456;
console.log(obj.x);//判断是否可写,writable
for(p in obj){
console.log('对象中的属性:'+p+'\\n');//判断是否可枚举,enumerable
}
console.log(Object.keys(obj));//列出自身所有的可枚举属性,判断是否可枚举。
console.log(Object.getOwnPropertyNames(obj));//列出自身所有属性,包括不可枚举。
输出为:
12
12 //值未改变,说明属性不可写,writable为false。
//for...in...无输出,说明对象无枚举属性。
[] //Object.keys(obj)的输出,值为空,说明无枚举属性。
["x"] //Object.getOwnPropertyNames(obj)的输出,说明‘x’为不可枚举属性。
示例:验证configurable
var obj={};
Object.defineProperty(obj,'z',{
value:'this is a test',
configurable:false,
});
console.log(obj.z);
delete obj.z;
console.log(obj.z);//验证configurable为false时,能否删除属性。
Object.defineProperty(obj,'x',{
value:'this is a test',
configurable:true,
});
console.log(obj.x);
delete obj.x;
console.log(obj.x);//验证configurable为true时,能否删除属性
输出为:
this is a test
this is a test //说明configurable为false时,不能删除属性
this is a test
undefined //说明configurable为true时,能删除属性
示例:configurable为false时,不能配置属性
var obj={};
Object.defineProperty(obj,'z',{
value:'this is a test',
configurable:false,
});
Object.defineProperty(obj,'z',{ //验证是否可重新配置属性
writable:true,
});
输出为:
"Uncaught TypeError: Cannot redefine property: z"//说明configurable为false时,不能重新配置属性。
示例:通过函数调用获取值
var obj={};
Object.defineProperty(obj,'x',{
get : function(){
return 123;
},
});
console.log(obj.x);
输出为:
123