对象是JavaScript的基本数据类型,是一种复合值:它将很多的值组合一起,可以通名字来访问这些值。属性名是字符串,可以把对象看成是字符串到值的映射。这种数据结构可以称为散列(hash)、散列表(hashtable)、关联数组。
对象常见的用法是创建、设置、查找、删除、检测和枚举。
每个对象都拥有三个相关的对象特性:
1、对象的原型指向另一个对象,本身的属性继承于另一个对象的原型对象。
2、对象的类是一个标识对象类型的字符串。
3、对象的扩展标记指明了是否可以向该对象添加新的属性
对象相关的术语
内置对象:ECMAScript规范定义的对象或者类,如数组、函数、日期和正则表达式。
宿主对象:JavaScript解释器嵌入宿主环境定义的,HTMLElement对象是宿主对象。
自定义对象:JavaScript代码创建的对象。
自有属性:直接在对象中定义的属性。
继承属性:在对象的原型对象中定义的属性。
创建对象
1、通过直接量创建对象:例如
var str = {};
var string = {
name:duxin,
age:18
}
2、通过new创建对象:new运算符创建并且初始化一个新的对象,new后边跟着一个函数(构造函数constructor),构造函数用来初始化一个新建的对象。
var str = new Object();
var arr = new Array();
var data = new Date();
var reg = new RegExp();//创建一个模拟匹配的RegExp对象。
3、通过原型来创建对象:
Object.prototype没有原型,它不继承于任何属性,其他原型对象都是普通对象,普通对象都具有原型。所有的内置构造函数都具有一个继承于Object.prototype的原型,例如:Date.prototype的属性继承于Object.prototype。
所有通过对象直接量创建的对象都具有同一个原型对象,
4、Object.create()创建对象, Object.create()是一个静态函数,不是提供给某个对象调用的方法。使用Object.create()创建对象,只需传入参数即可。
//返回一个继承自原型对象p的属性的新对象
function createObj(p){
if(p == null){}throw TypeError();
// p是一个对象,但不能是null
if(Object.create)
// 如果Object.create()存在
return Object.create(p);
// 直接使用它
var t = typeof p;
// 否则进行进一步检测
if(t !== "object" && t !== "function")throw TypeError();
function f(){};
// 定义一个空构造函数
f.prototype = p;
//将其原型属性设置为p
return new f(); //使用f()创建p的继承对象
}
对象属性的查询和设置
通过点火方括号运算符来获取属性的值。对于点(.)来说,右侧必须是一个以属性名称命名的简单标识符。对于方括号来说([]),方括号内必须是一个计算结果为字符串的表达式,这个字符串就是属性的名字。
删除属性
使用delete运算符来删除对象的属性。delete只是断开属性和宿主对象的联系,而不会去操作属性中的属性
检测属性
通过in运算符、hashOwnPreperty()、propertyIsEnumerable()方法来实现判断某个属性是否存在于某个对象中,hashOwnPreperty()用来检测属性是否属于对象自有的属性,针对于继承的属性,它将返回false。propertyIsEnumerable()检测自身属性的可枚举型为true时才返回true
var str = {name:"duxin"};
console.log("name" in str); //true
console.log("toString" in str); //true
console.log(str.hasOwnProperty("toaString")); //false,toString是继承来的属性。
使用for/in循环在循环体中遍历对象中所有的可枚举的属性(包括自有属性和继承属性),把属性名赋值给循环变量。对象内置方法不可枚举。例如:
var o = {x:12,y:25,z:56}
console.log(o.propertyIsEnumerable("toString"))//false
for(const a in o){
console.log(a)
}
//跳过继承属性
for(const k in o){
if (!o.hasOwnProperty(k)) {
continue
}
}
//跳过方法
for(const j in o){
if(typeof o[j] === "function"){
continue;
}
}
属性特征
调用Object.getOwnPropertyDescriptor(),可以获得某个对象特定(自有)属性的属性描述符;
Object.getOwnPropertyDescriptor(obj,"属性");
调用Object. definePeoperty(),传入要修改的对象、要创建或修改的属性的名称以及属性描述符对象:设置属性或者让新建属性具有某中特征。
var o = {};
Object.defineProperty(o,"x",{
alue:5,
writable:true,
enumerable:false,
configurable:true
});
console.log(o.x=6);
console.log(Object.keys(o));
调用Object.defineProperties(),修改或者创建多个属性。第一个参数是要修改的对象,第二个是一个映射表,包含了要新建或者修改的属性名称和属性描述符。语法:
var str = Object.defineProperties({},{x:{},y:{}});
任何对Object. defineProperty()或Object.defineProperties()违反规则的使用都会抛出类型错误异常:
1、若对象是不可扩展的,则可以编辑已有的自有属性,但不能给它添加新的属性;
2、若属性不可配置,则不能修改它的可配置性和可枚举性;
3、若存取器属性是不可配置的,则不能修改其getter和setter方法,也不能把它转化为数据属性;
4、若数据属性是不可配置的,则不能把它的可写性从false改成true,但是可以从true改成false;
5、如果数据属性是不可配置且不可写的,则不能修改它的值。然而可配置但不可写属性的值是可以修改的(实际上是先将它标记为可写的,然后修改它的值,最后转换为不可写的)。
网友评论