20-对象

对象

定义

​ 无序属性的集合,其属性可以包含基本值、对象或函数。可以将对象想象成散列表:键值对,其中值可以是数据或者函数。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的值
Booleantruefalse
String任何非空的字符串“”(空字符串)
Number任何非零数字(包括无穷大)0和NaN
Object任何对象null
Undefinedundefined

检测属性

检测一个属性是否属于某个对象

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}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值