对象-Object

一、对象的简单操作

(一)对象的建立

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

你可能感兴趣的:(对象-Object)