1.创建对象的方式
创建方式一:通过new Object()
var obj = new Object();
obj.name = "jeonghan";
obj.age = 19;
obj.running = function () {
console.log(this.name + "正在跑步");
};
console.log(obj);
创建方式二:字面量形式
var obj2 = {
name: "wonwoo",
age: 18,
eating: function () {
console.log(this.name + "正在吃饭");
},
};
console.log(obj1);
2.对对象的属性操作
基本操作
var obj = {
name: "david",
age: 11,
};
//获取属性
// console.log(obj.name);//david
// 删除属性
delete obj.age;
// console.log(obj);//obj{name:david}
// 给属性复制
obj.name = "joshua";
// console.log(obj.name);//obj{name:joshua}```
属性操作符
需求:对对象中的某些属性进行操作时,进行一些限制
比如:不允许某些属性被删除、修改、遍历、赋值
如果想要加上这些限制就必须要使用属性描述符,属性描述符需要使用object.defineproperty()方法去定义
第一个参数:要操作的对象
第二个参数:要操作的对象的属性,如果要操作的对象中并没有这个属性,那么就会像元对象中添加这个属性
第三个参数:属性描述符,为对象形式
// Object.defineProperty会改变原对象的值
Object.defineProperty(obj, "age", {
value: 1.88,
});
// 这里使用defineproperty对原对象操作之后,读取原对象obj是看不到新添加的age属性的
// console.log(obj); //obj{name:'joshua'}
//表面上看起来,该属性并不存在于obj对象中,但其实该对象现在已经有了age属性,只不过该属性目前是不可枚举属性
属性描述符可以分成两类
1.数据属性描述符
// configurable:当此值为false的时候就表明该属性不可修改、删除以及不可变更为存取属性。当直接在对象上面定义某个属性是此值为true。
// enumerable:当此值为false的时候就表明该属性不可以通过for in或者Object.keys返回该属性。直接在对象上定义某个属性时该值为true。
// writable:此值为false的时候表示该属性是不可修改的,。当直接在对象上定义某个属性的时候,该值是true
// value:属性的value值,读取属性时会返回该值,修改属性时会对其进行修改
const obj2 = {
sname: "wonwoo",
age: 19,
};
Object.defineProperty(obj2, "address", {
value: "首尔市",
// 表示该属性时不可配置的
configurable: false,
enumerable: true,
writable: true,
});
delete obj2.address;
// 直接log obj2的话显示address属性为灰色,表示不可读取,可以通过点的形式获取到该属性
// 所以上面的delete并没有生效
// console.log(obj2.address);
// console.log(Object.keys(obj2)); ------['sname', 'age', 'address']
obj2.address = "釜山";
// console.log(obj2.address); //首尔
2.存取属性描述符
// configurable enumerable get set
Object.defineProperty(obj2, "sno", {
configurable: true,
enumerable: true,
get() {},
set() {},
});
// 使用情况1:当我们不希望随便的向外暴露对象中的某一个属性时
var obj3 = {
name: "woozi",
age: "16",
// 一般js中定义私有属性的方式就是在前面加一个下划线
_address: "北京市",
};
Object.defineProperty(obj3, "address", {
configurable: true,
enumerable: true,
get: function () {
//取值
return this._address;
},
set: function (value) {
// 赋值
this._address = value
},
});
// 这样就可以通过存取属性描述符来实现不直接访问私有属性,但也能获取到私有属性的值的功能了
// 这玩意到底用来 干什么,我也不是很清楚
console.log(obj3.address); //北京市
obj3.address = "上海市"
console.log(obj3.address); //上海市
// 使用情况2:如果我们想要截获某一个属性的访问和设置值的过程,也可以使用存取属性描述符
对象方法的补充
// 获取对象中的某个属性的属性描述符
var obj = {
name: "zhangruiqing",
age: 18,
};
console.log(Object.getOwnPropertyDescriptor(obj, "name")); //{value: 'zhangruiqing', writable: true, enumerable: true, configurable: true}
// 获取对象中所有的属性描述符
console.log(Object.getOwnPropertyDescriptors(obj)); //{age: {value: 18, writable: true, enumerable: true, configurable: true},name: {value: 'zhangruiqing', writable: true, enumerable: true, configurable: true}}
object的方法对对象的限制
var obj = {
name: "jinghan",
age: 78,
};
//可以使用Object.preventExtensions来组织对象继续添加属性
// Object.preventExtensions(obj)
console.log(obj);
//{name: 'jinghan', age: 78}
// 2.禁止对象配置/删除对象里面的属性
// seal方法可以使对象中的所有属性变得不可配置 添加或者删除属性 但是可以修改属性值
Object.seal(obj);
obj.address = "北京市";
obj.name = "北京市";
console.log(obj); //{name: '北京市', age: 78}
// 3.禁止对象修改
Object.freeze(obj);
obj.name = "qqqqq";
console.log(obj); //{name: '北京市', age: 78}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。