0%

JavaScript对象-Object

javascript原生提供Object对象,所有其他对象都继承自这个对象,Object对象本身也是一个构造函数,可以通过它来生成新的对象。
Object作为构造函数使用时,可以接受一个参数。分为对象和原始类型的值两种:

  • 如果是对象,就直接返回这个对象。
  • 如果是原始类型的值,就返回该值对应的包装对象。
  • 如果没有传入参数,则和{}等价。

对象的原型属性 prototype

所有构造函数都有一个prototype属性,指向一个原型对象。凡是定义在Object.prototype对象上面的属性和方法,将被所有实例对象共享。

1
2
3
Object.prototype.print = function(){ console.log(this)};
var o = new Object();
o.print() // Object

在Object.prototype上定义了方法print,然后生成了Object的实例o,o直接继承了Object.prototype的属性和方法,可以在自身调用它们,也就是说,o.print实际调用了Object.prototype.print方法。即,这个print是实例对象的方法

静态方法

所谓静态方法,是指部署在Object对象自身的方法,调用方式为Object.funs()

自定义静态方法

定义在构造函数上的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function People (name, age) {
this.name = name;
this.age = age;
this.say = function(message) {
console.log(name + ' says: ' + message);
};
}
People.print = function(p){
console.log('name: ' + p.name + ' age: ' + p.age);
};
var tony = new People('tony', 24);
tony.say('my name is tony');

People.print(tony);

常用的Object的方法

Object.keys()

用来遍历对象的属性。参数为对象,返回为属性名的数组。Object.keys方法只返回可枚举的属性。

1
2
var tony = new People('tony', 24);
console.log(Object.keys(tony));//(3) ["name", "age", "say"]

其实,对象tony可以表示为这样:

1
2
3
4
5
6
7
var tony = {
name: 'tony',
age: 24,
say: function(message){
console.log(this.name + ' says: ' + message);
}
};

当参数为数组时,返回数组的索引:

1
2
var arr = [3, 4, 5];
console.log(Object.keys(arr));//(3) ["0", "1", "2"]

Object.getOwnPropertyNames()

这个方法和Object.keys()方法和相似,区别是Object.keys只返回可枚举的属性,但是Object.getOwnPropertyNames()返回所有属性,包括不可枚举的属性:

1
2
var arr = [3, 4, 5];
console.log(Object.getOwnPropertyNames(arr));//Array [ "0", "1", "2", "length" ]

Object对象的实例方法

除了Object对象本身的方法,还有不少是部署在Object.prototpye对象上的,所有Object的实例对象都继承了这些方法。常用的Object实例对象的方法,主要有以下六个:

  • valueOf() 返回当前对象对应的值
  • toString() 返回当前对象对应的字符串形式
  • toLocaleString() 返回当前对象对应的本地字符串的形式。
  • hasOwnProperty() 判断某个属性是否为当前对象对象自身的属性,还是继承自原型对象的属性。
  • isPrototypeOf() 判断当前对象是否为另一个对象的原型。
  • propertyIsEnumberAble() 判断某个属性是否可以枚举。

Object.prototype.valueOf()

valueOf方法的作用是返回一个对象的值,默认情况下返回对象本身。主要用途是,javascript自动类型转换时会默认调用这个方法。

回忆类型转换:对象的转换规则,先调用自身的valueOf方法,如果放回的是对象,就调用toString方法,如果是原始类型的值,就直接使用Number方法。

可以重新定义valueOf方法,使转换的时候得到期望的值

1
2
3
4
tony.valueOf = function() {
return ('name: ' + this.name + ' age: ' + this.age);
};
console.log(tony.valueOf());//name: tony age: 24

Object.prototype.toString()

toString的作用是返回一个对象的字符串形式,默认情况下返回类型字符串"[Object Object]".
值得注意的是,当数组调用toString方法时,返回的为数组的值构成的字符串,但是如果数组内部有对象时,对象部分还是会返回"[Object Object]"

1
2
var arr= [3, 4, 5, [3, 4, 5]];
console.log(arr.toString());//3,4,5,3,4,5

属性描述对象

javascript提供了一个内部的数据结构,用来描述一个对象的属性的行为,以及去控制它的行为。被称为属性描述对象(attribute object),下面是一个实例:

1
2
3
4
5
6
7
8
{
value: 'fdsfd',// 属性的值
writable: false,// 属性是否可以改变,默认为true
enumerable: true,// 属性是否可以枚举
configurable: false,//属性是否可配置
get: undefined,// 属性的取值函数
set: undefined,// 属性的存值函数
}

Object.getOwnPropertyDescriptor()

该方法可以读取出对象自身某属性的描述对象,参数为:Object.getOwnPropertyDescriptor(object, propertyName)

1
console.log(Object.getOwnPropertyDescriptor(tony, 'name'));//Object { value: "tony", writable: true, enumerable: true, configurable: true }

Object.defineProperty()/defineProperties()

defineProperty方法允许通过定义属性描述对象,来定义或修改一个属性,调用方式为:Object.defineProperty(object, propertyName, attributesObject);,如果该属性不存在,就给对象定义一个属性,如果存在,就是修改属性的描述对象。

1
2
Object.defineProperty(tony, 'name', {enumerable: false});
console.log(Object.keys(tony));//Array [ "age", "say" ]

上述代码的目的是,将tony对象的属性name修改为不可枚举的,导致Object.keys()方法无法获得name属性。
Object.defineProperties()方法是一次定义或修改多个属性,调用方式为:

1
2
3
4
5
6
7
8
9
Object.defineProperties(object, {
att1:{
key:value
},
att2:{
key1: valeu1,
key2:value2
}
});
码字辛苦,打赏个咖啡☕️可好?💘