对象
定义
无序属性的集合,其属性可以包含基本值、对象或函数。可以将对象想象成散列表:键值对,其中值可以是数据或者函数。ECMAScript中的对象其实就是一组数据(属性)和功能(方法)的集合。
对象是一个包含相关数据和方法的集合(通常由一些变量和函数组成,我们称之为对象里面的属性和方法)。
对象的创建
对象的初始化有两种方式:字面量模式和构造函数模式
1.字面量模式
var obj = {
name:'zhangsan',
age:18,
sayName:function(){
console.log(this.name);
}
}
2.构造函数模式
var obj = new Object();
obj.name = 'zhangsan';
obj.age = 18;
obj.sayName = function(){
console.log(this.name);
}
obj.sayName();
console.log(obj);
对象的访问
var obj = {
name:'zhangsan',
age:18,
sayName:function(){
console.log(this.name);
}
}
//属性访问
//点语法访问
console.log(obj.name);
//key属性访问
//注意点:如果用中括号访问一个属性 要记得加上引号
console.log(obj['age']);
//方法访问
console.log(obj.sayName);
//如果要执行对象中的某一个方法 函数名() 执行
obj.sayName();
//使用for in循环遍历一个对象‘
for(var key in obj){
console.log(key + '-' + obj[key]);
}
新增删除对象中的属性
//通过delete属性删除对象中的一些属性
delete obj.name;
console.log(obj);
//添加新的属性
obj.name = 'zhangsan';
console.log(obj);
显示类型转换
ECMAScript三种强制类型转换:
- Boolean(value)
- String(value)
- Number(value)
var obj = {
name:'Justin',
age:19,
//重写toString的方法
toString:function(){
return this.name + '--' + this.age;
return 100;
}
//重写valueOf的方法
valueOf:function(){
return 200;
}
}
//Object转Boolean
console.log(Boolean(obj));
//Object转String
console.log(String(obj),typeof String(obj));
//模拟String包装器转换的过程
console.log(obj.toString());
//转换规则
//显示转换与隐式转换规则类似,当要将对象转换为String时,类似隐式转换中的PreferredType为String
//1.先调用对象的toString方法
//2.判断该方法的返回值是否为基础数据类型(Number,String,Boolean,Undefined,Null)
//3.若返回值为基础数据类型,则转换规则按照相应数据类型的转换规则对其进行转换
//4.若返回值不为基础数据类型,则在该返回值的基础上继续调用valueOf方法
//5.判断valueOf的返回值是否为基础数据类型
//6.判断是否为基础数据类型,若是基础数据类型则进行操作3
//7.若仍旧不为基础数据类型则报错
//Number包装器 直接进行转换
console.log(Number(obj));
//Object转Number
console.log(obj.valueOf().toString());
//转换规则
//显示转换与隐式转换规则类似,当要将对象转换为Number时,类似隐式转换中的PreferredType为Number
//1.先调用对象的valueOf方法
//2.判断该方法的返回值是否为基础数据类型(Number,String,Boolean,Undefined,Null)
//3.若返回值为基础数据类型,则转换规则按照相应数据类型的转换规则对其进行转换
//4.若返回值不为基础数据类型,则在该返回值的基础上继续调用toString方法
//5.判断toString的返回值是否为基础数据类型
//6.判断是否为基础数据类型,若是基础数据类型则进行操作3
//7.若仍旧不为基础数据类型则报错
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空的字符串 | “”(空字符串) |
Number | 任何非零数字(包括无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | 无 | undefined |
检测属性
检测一个属性是否属于某个对象
var obj = {
name:'zhangsan',
age:18,
gender:'male'
}
//in 检测某属性是否是某个对象的自由属性或者是继承属性
console.log('name' in obj);
console.log('toString' in obj);
//Object.prototype.hasOwnProperty() 检测给定的属性是否是对象的自由属性,对于继承属性将返回false
console.log(obj.hasOwnProperty('name'));
//不会去监测继承属性
console.log(obj.hasOwnProperty('toString'));
//Object.prototype.propertyIsEnumerable() 是hasOwnProperty()的增强版,除了是自身属性外,还要求是可枚举属性,即我们创建的属性。
console.log(obj.propertyIsEnumerable('name'));
console.log(obj.propertyIsEnumerable('toString'));
Object原型属性及方法
在Object的构造函数的原型对象中的属性和方法都可以被Object构造函数的实例所继承。
Object原型中的所具有的任何属性和方法也同样存在于其他对象中,任何对象继承自Object。
Object原型中常用的方法:
- constructor
- hasOwnProperty(propertyName)
- propertyIsEnumerable(propertyName)
- valueOf()
- toLocaleString()
- toString()
- isPropertyOf(object)
//使用构造函数创建实例
var obj = new Object();
//调用原型对象中继承的方法
console.log(obj.toString());
console.log(obj._proto_.toString());
//构造函数
console.log(Object);
//原型对象
console.log(Object.prototype);
// 原型对象中的constructor属性 原型对象中的constructor属性指向构造函数
console.log(Object.prototype.constructor);
// 实例__proto__ 指向 原型对象
console.log(obj.__proto__ === Object.prototype);
// 创建Date对象
var now = new Date();
console.log(now);
// 使用原型对象中的方法
console.log(now.toString());
console.log(now.toLocaleString());
定义属性
//定义属性
var obj = {
name:'zhangsan',
age:18,
}
Object.defineProperty(obj,'name',{
configurable:true,
enumerable:true,
writable:true,
value:'terry'
})
delete obj.name;
obj.name = 'zhangsan'
console.log(obj);
// 对于多个属性进行定义属性的处理
var obj = {
name: 'zhangsan',
age: 18,
gender: 'male',
}
Object.defineProperties(obj, {
name: {
value: 'terry',
},
age: {
writable: false,
value: 20
}
})
obj.age = 22;
console.log(obj);
//读取属性
var obj = {
name: 'zhangsan',
age: 18,
}
//查询对象自有属性的一些属性描述符
var a = Object.getOwnPropertyDescriptor(obj, 'name');
var desc = Object.getOwnPropertyDescriptors(obj);
console.log(desc);
console.log(a);
//访问器属性
var book = {
_year: 2020,
editor: 1
}
book._year = 2021;
console.log(book);
//访问器属性结合定义属性来使用
Object.defineProperty(book, 'year', {
get: function () {
// 获取到_year
return this._year;
},
set: function (newYear) {
if (newYear !== this._year) {
this._year = newYear;
}
}
})
console.log(book);
book.year = 2021;
console.log(book);
console.log(Object.getOwnPropertyDescriptors(book));
//对象序列化
var obj = {
name:'lisi',
age:18
}
// 序列化 JSON.stringify(obj) 将对象序列化为JSON字符串,只能序列化对象可枚举的自有属性
var jsonStr = JSON.stringify(obj);
console.log(jsonStr,typeof jsonStr);
// 反序列化 JSON.parse(jsonStr)反序列化
var jsonObj = JSON.parse(jsonStr);
console.log(jsonObj,typeof jsonObj);
console.log(obj === jsonObj);
//{...obj}