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}

its
1 声望0 粉丝

下一篇 »
PHP