这次彻底理解了Object这个属性
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。访问器属性不包含值,而是定义了一个get和set函数,当读取属性时,调用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这个属性的更多相关文章
- 简单理解js的prototype属性
在进入正文之前,我得先说说我认识js的prototype这个东西的曲折过程. 百度js的prototype的文章,先看看,W3School关于prototype的介绍: 你觉得这概念适合定义js的pr ...
- 深入理解JavaScript中的属性和特性
深入理解JavaScript中的属性和特性 JavaScript中属性和特性是完全不同的两个概念,这里我将根据自己所学,来深入理解JavaScript中的属性和特性. 主要内容如下: 理解JavaSc ...
- 面向对象的程序设计(二)理解各种方法和属性typeof、instanceof、constructor、prototype、__proto__、isPrototypeOf、hasOwnProperty
//理解各种方法和属性typeof.instanceof.constructor.prototype.__proto__.isPrototypeOf.hasOwnProperty. //1.typeo ...
- 半深入理解CSS3 object-position/object-fit属性
半深入理解CSS3 object-position/object-fit属性 转载:https://www.zhangxinxu.com/wordpress/2015/03/css3-object-p ...
- 深入理解css中position属性及z-index属性
深入理解css中position属性及z-index属性 在网页设计中,position属性的使用是非常重要的.有时如果不能认识清楚这个属性,将会给我们带来很多意想不到的困难. position属性共 ...
- js object 对象 属性和方法的使用
//object 对象 属性和方法的使用 var person = new Object(); person.name="张海"; person.age="; perso ...
- js动态参数作为Object的属性取值
js动态参数作为Object的属性取值var myObj = {"a":1,"b":2};var a = 'a';myObj[a] 就可以获取到 属性a的值了
- 面向对象中Object常用属性总结
学完Object属性,自己总结一些常用是Object常用属性. Object.prototype:属性表示Object的原型对象. 属性: Object.prototype.constructor:特 ...
- u3d中刚体与碰撞体的理解以及is Trigger属性的意义
刚体:个人理解就是具有物理属性(如:质量),接受物理作用(如:重力)的组件. 碰撞体:个人理解就是计算碰撞后的物理量(如:弹力). 刚体与碰撞体的关系:个人理解判断碰撞体就是需要计算力,如果碰撞的物体 ...
随机推荐
- c++代码的编译
1.gcc和g++ 1.1搞清楚几个名字 GCC :GNU Compiler Collection (GUN编译套件),可以编译c,c++,java,objective-c,F ...
- JavaSE中常见的工具类
Arrays 用来操作数组, 常用方法是 sort()和toString()方法 Iterator 我们常说的迭代器就是这哥们,专门用来操作集合元素的工具类 常用方法是: hasNex()t和next ...
- vuex的学习笔记
什么是Vuex? vuex是一个专门为vue.js设计的集中式状态管理架构.状态?我把它理解为在data中的属性需要共享给其他vue组件使用的部分,就叫做状态.简单的说就是data中需要共用的属性. ...
- 排序算法Java实现(选择排序)
算法描述:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他记录进行第二轮比较,得到最小的记录并与第二个记录进行位置交换:重复 ...
- 一次精疲力尽的改bug经历
一.介绍 最近一直在做有关JavaScriptCore的技术需求,上周发现一个问题,当在JavaScriptCore在垃圾回收时,项目会有一定几率发生崩溃.崩溃发生时调用堆栈如下: 图1 调用堆栈 先 ...
- [jdoj1090]矩阵_区间dp
矩阵 jdoj-1910 题目大意:给你连续的n个矩阵的长和宽,保证每连续的两个相邻矩阵满足相乘的条件,不能改变题目中矩阵的位置,求将这些矩阵相乘为一个矩阵的最小乘法次数. 注释:1<=n< ...
- 测试驱动开发实践2————从testList开始
内容指引 1.测试之前 2.改造dto层代码 3.改造dao层代码 4.改造service.impl层的list方法 5.通过testList驱动domain领域类的修改 一.测试之前 在" ...
- openjudge(二)
强制类型转换的作用:按照规范输出.
- .Net开发之旅(一个年少轻狂的程序员的感慨)
高端大气上档次.这次当时一个身为懵懂初中生的我对程序员这一职位的描述.那时虽不是随处都能看到黑客大军的波及,但至少是知道所谓的黑客爸爸的厉害,一言不合说被黑就被黑.对于懵懂的我那是一种向往.自己也曾想 ...
- 转发—Android开发常用的插件及工具
作者:蓝之风 出处:http://www.cnblogs.com/vaiyanzi/ Android开发常用的插件及工具 1.GitHub,这个不管是做安卓还是其他,只要是开发就必上的网站,也是天朝没 ...