1.实例化Object对象

实例化Object对象的方式有两种:使用Object构造器和使用对象的字面量。例如:

var person1 = {
name: '李四'
}; var person2 = new Object();
person2.name = '王二';

2.为实列添加属性

我们可以随时随地为对象添加属性,也可以随时修改属性的值。

var person1 = {
name: '小明'
}; var person2 = new Object();
person2.name = '小红'; //给对象添加属性
person1.age = 23;
person2.age = 25; //修改属性的值
person1.name = '张三';
console.log(person1.name); //'张三'
person2.name = '李四';
console.log(person2.name); //'李四'

3.删除对象中的属性

var person1 = {
name: '张三'
}; person1.name = null; console.log(person1.name); //'张三' delete person1.name; console.log(person1.name); //'undefined'

4.检查属性

由于对象的属性可以被随时随地被修改或删除,因此有时候我们需要检查对象的某个属性是否存在。使用下面的方式检查是不可靠的:

var person1 = {
name: '张三'
}; person1.name = '';//或者null/undefined if (person1.name) { console.log('存在'); } else { console.log('不存在'); //'不存在'
}

使用这种方式可能会得不到正确的结果,如果属性的值是:对象,非空字符串,非零的数或者true,if条件语句会把它们转换成true。如果属性的值是:null,undefined,0,false,NaN,空字符串,if条件语句会把它们转换成false。检差对象中的属性是否存在的更可靠的方式是使用in操作符:

var person1 = {
name: '张三'
}; person1.name = '';//或者null/undefined if ('name' in person1) { console.log('存在'); //'存在' } else { console.log('不存在');
}

5.遍历实列的属性

默认情况下,我们添加到对象上的属性都是可枚举的,这样的话我们就可以使用for-in循环遍历它们。

var obj = {
name: '王志龙',
age: 23,
gender: '男',
address: '鹤壁'
}; var propertyName; for (propertyName in obj){ console.log('属性名:' + propertyName);
console.log('属性值:' + obj[propertyName]);
}

for-in循环每循环一次都会将一个属性名赋值给propertyName,直到所有的属性都被遍历一遍为止。

如果我们只是想获取一个对象中的所有属性名,可以使用Object.keys()方法。该方法会以数组的形式返回所有的属性名。

console.log(Object.keys(obj));     // ["name", "age", "gender", "address"]

6.属性的分类

属性的类型分两种:一种是数据属性,一个种是访问器属性。数据属性用来存储一个值,比如所上个例子中的name。访问器属性不包含值,而是定义了一个getset函数,当读取属性时,调用get函数,当写属性时,调用set函数。

下面是一个使用字面量的形式定义访问器属性的语法:

var obj = {

    _myname: 'clw',

    get name(){

        console.log('get方法被调用了');
return this._myname + '1111'; },
set name(value){ console.log('set方法被调用了');
this._myname = value; }
}; console.log(obj.name);

7.属性的内部

  7.1共享的属性:

数据属性和访问器属性共享的内部特性有两个:一个是[[Enumerable]],这个特性决定了我们是否能够遍历该属性。另一个是[[Configurable]],这个特性决定了我们是否能够改变属性。默认情况下我们在对象上添加的属性都是可枚举、可配置的。

如果我们向改变属性的特性,可以使用Object.defineProperty()方法。该方法接受3个参数:拥有被修改属性的对象、被修改的属性名、包含描述特性的对象。描述符和内部特性名称相同,但是没有方括号。例如,我们将一个属性改成不能枚举,不能配置:

var person1 = {
name: '张三',
age: 22
}; console.log(person1.propertyIsEnumerable('name')); Object.defineProperty(person1, 'name', {
enumerable: false
}); console.log('name' in person1); //true
console.log(person1.propertyIsEnumerable('name')); //false var properties = Object.keys(person1);
console.log(properties); //["age"] //delete person1.name;
//console.log(person1.name); //'undefined' Object.defineProperty(person1, 'name', {
configurable: false
}); delete person1.name;
console.log(person1.name); //'张三'

  7.2访问器属性内部的特性:

var obj = {

    _myname: 'clw',

    get name(){

        console.log('get方法被调用了');
return this._myname + '1111'; },
set name(value){ console.log('set方法被调用了');
this._myname = value; }
}; //上面的代码等价于: var obj2 = {
_myname: 'clw'
}; Object.defineProperty(obj, 'name', {
get: function() { console.log('get方法被调用了');
return this._myname + '1111'; },
set: function(value) { console.log('set方法被调用了');
this._myname = value; },
configurable: true,
enumerable: true
});

  7.3定义多个属性的内部特性:

定义单个属性的内部特性使用Object.defineProperty(),定义多个属性使用的是Object.defineProperties(),这个方法接受2个参数,第一个是属性所属的对象,第二个是包含被定义属性的对象。

  var person1 = {};

        Object.defineProperties(person1, {
name: {
value: '张三',
enumerable: true,
configurable: true,
writable: true
},
age: {
value: 23,
enumerable: false,
configurable: false,
writable: false
},
address: {
get: function(){ },
set: function(value){ },
enumerable: true,
configurable: true
}
}); console.log(person1.name); //'张三'
person1.name = '李四';
console.log(person1.name); //'李四' console.log(person1.age); //23
person1.age = 500;
console.log(person1.age); //23

  7.4获取属性内部的特性

获取属性的内部特性的方法有两个:Object.getOwnPropertyDescriptor()Object.getOwnPropertyDescriptors()

var person1 = {};

        Object.defineProperties(person1, {
name: {
value: '张三',
enumerable: true,
configurable: true,
writable: true
},
age: {
value: 23,
enumerable: false,
configurable: false,
writable: false
},
address: {
get: function(){ },
set: function(value){ },
enumerable: true,
configurable: true
}
}); //获取对象中单个属性的内部特性
var descriptor = Object.getOwnPropertyDescriptor(person1, 'address');
//获取对象中所有属性的内部特性
var descriptors = Object.getOwnPropertyDescriptors(person1);
console.log(descriptors);

这次彻底理解了Object这个属性的更多相关文章

  1. 简单理解js的prototype属性

    在进入正文之前,我得先说说我认识js的prototype这个东西的曲折过程. 百度js的prototype的文章,先看看,W3School关于prototype的介绍: 你觉得这概念适合定义js的pr ...

  2. 深入理解JavaScript中的属性和特性

    深入理解JavaScript中的属性和特性 JavaScript中属性和特性是完全不同的两个概念,这里我将根据自己所学,来深入理解JavaScript中的属性和特性. 主要内容如下: 理解JavaSc ...

  3. 面向对象的程序设计(二)理解各种方法和属性typeof、instanceof、constructor、prototype、__proto__、isPrototypeOf、hasOwnProperty

    //理解各种方法和属性typeof.instanceof.constructor.prototype.__proto__.isPrototypeOf.hasOwnProperty. //1.typeo ...

  4. 半深入理解CSS3 object-position/object-fit属性

    半深入理解CSS3 object-position/object-fit属性 转载:https://www.zhangxinxu.com/wordpress/2015/03/css3-object-p ...

  5. 深入理解css中position属性及z-index属性

    深入理解css中position属性及z-index属性 在网页设计中,position属性的使用是非常重要的.有时如果不能认识清楚这个属性,将会给我们带来很多意想不到的困难. position属性共 ...

  6. js object 对象 属性和方法的使用

    //object 对象 属性和方法的使用 var person = new Object(); person.name="张海"; person.age="; perso ...

  7. js动态参数作为Object的属性取值

    js动态参数作为Object的属性取值var myObj = {"a":1,"b":2};var a = 'a';myObj[a] 就可以获取到 属性a的值了

  8. 面向对象中Object常用属性总结

    学完Object属性,自己总结一些常用是Object常用属性. Object.prototype:属性表示Object的原型对象. 属性: Object.prototype.constructor:特 ...

  9. u3d中刚体与碰撞体的理解以及is Trigger属性的意义

    刚体:个人理解就是具有物理属性(如:质量),接受物理作用(如:重力)的组件. 碰撞体:个人理解就是计算碰撞后的物理量(如:弹力). 刚体与碰撞体的关系:个人理解判断碰撞体就是需要计算力,如果碰撞的物体 ...

随机推荐

  1. 网站转变风格的css变化

    网站换肤,是一个比较老的话题了,理论很清晰,就是要根据js 来变换文件加载的css文件,根据需求来加载不同的css文件,有了这个基础就很明确要怎么做了,但是实际上还要记录当前用户的cookie  保证 ...

  2. 1-7 hibernate关联关系映射

    1.关联关系分为单向关联(一对一,一对多,多对一,多对多),多向关联(一对一,一对多,多对多). 2.单向一对一主键关联实例 需要为one-to-one元素指定constrained属性值为true. ...

  3. Myeclipse快速补充返回值快捷键

    比如 image.getGraphics(); 按ALT+Shift+L键,弹出一个确认变量名称框,确认之后会补全语句Graphics graphics = image.getGraphics();

  4. selenium +python+windows 环境搭建

    很久不弄selenium了,好怀念,现在搭建下环境 1,先安装pip ,因为装的是python3,所以只要你不是在渣渣网站下载到坏的版本,在scripts目录下都有pip.exe文件 直接在环境变量里 ...

  5. 将 Shiro 作为应用的权限基础 三:基于注解实现的授权认证过程

    授权即访问控制,它将判断用户在应用程序中对资源是否拥有相应的访问权限. 如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限等等. 一.用户权限模型 为实现一个较为灵活的用户权限数据模 ...

  6. canvas填充样式

    填充样式主要针对fillStyle.fillStyle除了可以赋值为color,还可以赋值渐变色,包括线性渐变色和径向渐变色,还是和css3里的内容类似. 一.线性渐变 1.设置线性渐变的填充样式 设 ...

  7. jQuery学习笔记 .addClass()/.removeClass()简单学习

    使用jQuery或javaScript来动态改变页面中某个或部分元素的样式,为了实现这样的功能,我们往往都是使用jQuery或javaScript来控制HTML中DOM的类名(class)从而实现增加 ...

  8. git项目初始化

    Command line instructions 1.Git global setup git config --global user.name "99176942"git c ...

  9. CSS3动画箭头

    <style type="text/css"> .arrow { display: block; width: 20px; height: 20px; position ...

  10. Entity Framework——并发策略

    使用EF框架遇到并发时,一般采取乐观并发控制. 1支持并发检验 为支持并发检验,需要对实体进行额外的设置.默认情况下是不支持并发检验的.有以下两种方式: 方式名称 说明 时间戳注解/行版本 使用Tim ...