对象
对象是JavaScript的基本数据类型,是多个属性的集合。通过键值对来保存,属性名是一个字符串。
对象初始化
创建对象的方法常用的有两种,一是对象直接量,二是通过new关键字
1. 字面量
使用"{}"作为对象边界,对象中包含多个属性,属性与属性之间通过“,”隔开,属性由属性名和属性值组成,通过“:”隔开。并且属性名一般不添加引号,除非属性名中包含了特殊字符(除了字符,数字,_,$之外的符号)。
属性值可以为变量也可以常量。
var phone = "18812344321";
var obj = {
"1":"a",
name:"terry",
"first name":"jacky",
age:12,
telephone:phone,
gender:"male",
sayName:function(){
console.log("my name is ",this.name);
}
};
2. 构造函数
通过new关键字创建对象
var obj = new Object(); //等价 var obj = {}
js对象可以动态的添加或删除属性
obj.name = "terry";
obj.age = 12;
obj.sayName = function(){
console.log("my name is",this.name);
}
对象属性访问(写入,读取)
1. 点访问符
var obj = {};
obj.name = "terry" // 写入
var name = obj.name; // 读取
2. 中括号访问符
当属性名为变量的时候适合访问
var obj = {name:"terry",age:12}
var name = "age"
obj[name] // 等价于obj["age"] 等价于obj.age
对象属性检测
"name" in obj // 判断obj中是否含有一个属性名为name的属性
对象属性遍历
对象属性的遍历只能遍历出那些可迭代的属性,用户默认添加的属性都为可迭代属性。不可迭代属性:console.log的时候不显示,以及无法使用for-in循环遍历出来。但是可以访问
var obj = {name:"terry",age:12}
for(var k in obj){
var v = obj[k]
console.log(k,v);
}
//每次循环从obj中获取属性名赋值给k,
删除对象属性
delete obj.name //从obj对象中删除name属性
对象序列化
数据的传输不能传一个对象,而对象序列化就是将对象转换为字符串,便于数据传输。序列化的方式有两种:json与qs查询字符串
1. json json字符串
json就是字符串格式
'{"username":"terry","password":"123321"}'
var obj = {
username:"terry",
password:"123321"
};
var json = JSON.stringify(obj)
//json为'{"username":"terry","password":"123321"}'
返序列化,将字符串转换为对象
var obj = JSON.parse('{"name":"terry","age":12}')
// obj为{name:"terry",age:12}
2. qs 查询字符串
let qs = require('querystring')
var obj = {
username:"terry",
password:"123321"
};
var qs = querystring.stringify(obj)
//qs为 'username=terry&password=123321'
var obj = querystring.parse('name=terry&age=12')
// obj 为 {name:"terry",age:12}
Object
构造函数
var obj = new Object();
obj.__proto__ 内部属性,不可迭代的属性
实例无法调用其构造函数中的方法,
obj 不能调用 Object中的方法,但是可以调用Object.prototype中的方法
1. 静态方法(声明在构造函数内部的方法)
Object.assign(a,b) 将a,b对象合并
Object.keys(obj) 获取obj中所有的属性名,返回数组
Object.values(obj)
Object.defineProperty() 定义属性
2. 非静态方法(声明在原型中的方法)
*Object.prototype.constructor
*Object.prototype.toString()
*Object.prototype.valueOf()
*Object.prototype.hasOwnProperty(k)
var obj = {name:"terry",age:12}
obj.hasOwnProperty("name") //判断name是否是obj的自有属性
*Object.prototype.propertyIsEnumerable(k)
定义属性
1. 如何将一个属性设置为不可迭代的
对属性设置enumerable:false,该属性不可迭代,obj只会显示name一个属性,但weight属性是存在的;若设为true则该属性可以迭代出来
var obj = {
name:"terry"
}
Object.defineProperty(obj,"weight",{
configurable:true,
enumerable:false,
value:"240斤"
})
2. 如何设置一个只读属性
Object.defineProperty(obj,"gender",{
configurable:true,
enumerable:true,
writable:false,
value:"男"
})
3. 如何监听某个属性的改变
这个原理是vue的本质原理。vue是数据驱动框架,当数据发生改变的时候,视图自动更新。
Object.defineProperty(obj,"age",{
configurable:true,
enumerable:true,
set:function(v){ // 在obj.age = 22
console.log("生日到了,准备礼物...");
this._age = v;
},
get:function(){
return this._age; //在访问obj.age调用
}
})
obj.age = 22;