一、创建对象的三种方法
1、字面量方式创建
var obj={
a:"战三",
b:"李四"
}
2、new构造器的方法,首先要了解原型链
function foo(){}//当创建函数对象之后,函数对象默认会带有一个foo.prototype.属性。属性是一个对象属性
var objNew = new foo();//创建一个新对象,他的原型指向foo.prototype
objNew.x = 2;
objNew,y = 3;
3、Object.create创建对象
var objCreate = Object.create({x:1})
var objCreate = Object.create(null)
/*
*用create创建对象,传入的值,直接赋值给对象的原型链,而不是对象本身。
*传入null之后,对象的原型直接就是null,不会包含任何方法objCreate.toString显示undefined。
*/
二、查找和删除
* in操作符检查对象中是否有这个属性,会继续向上查找,到原型链顶端,object.prototype
* hasOwnProperty检查对象中是否有这个属性时,只会查找对象本身,不会向上查找对象的原型链。
* 查找属性的值时,会沿着原型链查找,但是给对象赋值时,不会像原型链查找属性赋值,只会在对象本身添加或修改属性和值,原型链上的保持不变。
* delete obj.z删除对象上的属性。不会删除原型链上的属性
* 可继承原型链上的属性,但是不会修改原型链上的属性,只有继承权没有修改权。
三、对象的一些方法
1、获取属性中的所有标签:Object.getOwnPertyDescriptor(要查看的对象,’要查看的属性’)
2、configurable表示是否可配置,返回false为不可配置,true为可配置
3、propertyIsEnumerable(“检测属性”)是否可枚举属性。(for..in..遍历的时候)
4、Object.defineProperty(对象名,’属性’,{enumerable:false,value:1000}),设置自定义属性不可枚举
5、属性枚举
var o={x:1,y:2,z:3}
var key;
for(key in o){
console.log(key)//x,y,z
}
6、只想枚举对象本身的属性,不想获取对象原型链上的属性
for(key in o){
if(obj.hasOwnProperty(key)){
console.log(key)//x,y,z
}
}//用hasOwnProperty过滤一下。
7、getOwnPropertyDescriptor({pro:true},’pro属性名’),查看一个属性上面都有哪些属性标签
8、给空对象设置属性
var person={};
Object.defineProperty(person,'name',{
configurable:false,
writable:false,
enumerable:true,
value:"bos man"
})
//通过Object.key(person)可获得对象上所有的key
9、对象设置多个属性
Object.defineProperties(person,{
title:{value:'fe',enumerable:true},
corp:{value:'baba',enumerable:true}
})
//想赋值和修改属性,writable必须为true
//想删除和修改getter和setter和修改属性标签configurable必须为false
10、 查看对象是否可扩展,Object.isExtensible(对象名)
11、设置对象不可扩展(阻止对象添加新的属性),Object.preventExtensible(对象名)
12、Object.seal(obj)将对象上所有属性的configurable设置为false
13、Object.freeze(obj)设置对象不可配置,不可写,不可删除
14、对象序列化JSON.stringify(obj),对象转换成字符串
**注:如果对象中的属性值是undefined,那么这个属性将不会出现在序列化字符串结果当中,
如果是值是NAN或Infinity,序列化之后值为null,
如果是new Date()结果为当前时间**
15、后端返回JSON数据,转换为对象的方法:JSON.parse(‘{“x”:1}’)
四、对象标签
1、proto
2、class:表示对象是哪一个类型,通过Object.prototype.toString()方式获取class
3、extensible:表示对象是否可扩展,对象上的属性是否可以被继续添加