什么是对象
1.什么是对象
对象是属性的无序集合,每个属性都有一个名/值对,属性的名称是一字符串
{x:“123”,y:“hello”,z:123}
2.对象的种类
(1).内置对象(native object)是由CMAScript规范定义的对象或类,例如:数组,函数,日期和正则表达式都是内置对象
(2).宿主对象(host object)是由JavaScript解释器所嵌入的宿主环境(比如web浏览器)定义的,常见的宿主对象有Window .document等
(3).自定义对象(user-defined object)是由运行中的JavaScript代码创建的对象
创建对象的方式
1.对象直接量
var empty = {}; //没有任何属性的对象
var point ={
x:0,
y:0
}; //两个属性
var point2 = {
x:point.x,
y:point.y + 1
}; //更复杂的值,x的值是0,y的值是1
var book = {
"main title":"javascript", //属性名字里面有空格,必须用字符串表示
"sub - title":"对象课程", //属性名字里有连字符,必须用字符串表示
"for":"基础学院", //“for”是保留字,因此必须用引号
author:{ //这个属性的值是一个对象
firstname:"你", //注意,这里的属性名没有引号
surname:"好"
}
}
属性名可以是标识符(即变量符号a,b,c )也可以是字符串(包括空字符串)
属性值可以是任意类型的JavaScript表达式,表达式的值就是这个属性的值
2.通过new指令创建对象
关键字new后跟随一个函数调用,这里的函数称作构造函数(constructor),构造函数用以初始化一个新创建的对象。JavaScript语言核心中的原始类型都包含内置构造函数
var o = new Object(); //创建一个空对象,和{}一样
var a = new Arrayt(); //创建一个空数组,和[]一样
var d = new Datet(); //创建一个表示当前时间的Date对象
var f = new RegExp("js"); //创建一个可以进行模式匹配的EegExp对象
3.对象属性的查询
可以通过点(.)或者方括号( [ ] )运算符来获取属性的值
点号左侧一定要是一个对象,右侧必须是一个以属性名称命名的简
简单标识符(即变量,不能使用字符串),所以一但元素的某个属性名称是一个包含里空格的字符串,就不能使用点号来查询
var author = book.author;//得到book的“author”属性
var name = author.surname//得到获得author的“surname”属性
对象的左侧一定要是一个对象,右侧必须是一个计算结果为字符串()或是可以转换为字符串的值的表达式,这个字符串就是属性的名字
var s="main title";
var title = book["main title"]; //得到book的“main title”属性
var title = book[s]; //得到book的“main title”属性
4.对象属性的设置
通过点(.)或方括号([ ])运算符来获取属性的名称结合赋值操作符(=)实现属性值的设置
{ }[" 属性名称 "] = 属性值
{ } . 属性名称 = 属性值
对象的属性的常用操作
1.删除对象属性
delete运算符可以删除对象的属性,他的操作数应当是一个属性访问表达式
需要注意,delete只是断开属性与宿主对象的联系,而不会去操作内存中对象的属性的值的存在与否
2. 检测对象属性之in运算符
in运算符左侧是属性名,右侧是对象,如果对象的自有属性或继承属性中包含这个属性则返回true,不包含则返回false
3.检测对象属性之hasOwnPreperty()
该方法用于检测给定的名字是否是对象的自有熟悉,对于不存在的属性和继承属性它将返回false
var o = {
x:1
}
o.hasOwnPreperty("x"); //true:o有一个自有属性
o.hasOwnPreperty("y"); //false:o中不存在属性y
o.hasOwnPreperty("toString"); //false:toString是继承属性
4.枚举对象属性之propertylsEnumerable()
除了检测对象的属性是否存在,我们还会经常遍历对象的属性,通常使用for/in循环遍历,for/in循环可以在循环体中遍历对象中所有可枚举的属性(包括自有属性和继承的属性)对象继承的内置方法不可枚举的,但在代码中给对象添加的属性都是可以枚举的
var o ={
x:1,
y:2,
z:3
}; //三个可枚举的自有属性
o.propertylsEnumerable("toString") // ==> false,不可枚举
for(p in o){
console.log(p); //输出x,y,z,不会输出tostring
}//遍历属性
对象的属性的特性
1.对象属性的特性
属性的特性所服务的对象是JavaScript的解析引擎,是JavaScript引擎的内部值,所以作为程序员是无法直接获取到的,在JavaScript中的对象的属性有两种,分别是数据属性和访问属性。为了表示特性是内部之,该规范把他们放在来两对方括号中,如[[ Enumerable]]
数据属性包含一个数据值的位置,在这个位置可以读取和写入值,数据属性有4个描述其行为的特征
- [ [ Configurable ] ]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。像下面例子中那样直接在对象上定义的属性,他们的这个特性默认值为true。
- [ [ Enumerable ] ]:表示能否通过for-in 循环返回属性。像下面例子中那样直接在对象上定义的属性,他们的这个特性默认值为true。
- [ [ Writable ] ]:表示能否修改属性的值。像下面例子中那样直接在对象上定义的属性,他们的这个特性默认值为true。
- [ [ Value ] ]:包含这个属性的数据值。读取属性值的时候,从这个位置读:写入属性值的时候,把新值保存在这个位置。这个特性的默认值为undefined。
var empty = {}; //没有任何属性的对象
var point ={
x:0,
y:0
}; //两个属性
var point2 = {
x:point.x,
y:point.y + 1
}; //更复杂的值,x的值是0,y的值是1
2.获取对象属性的特性Object.getOwnPropertyDescriptor()
var o ={
x:1,
y:2,
z:3
};
console.log(Object.getOwnPropertyDescriptor(o,"x"));
Object.getOwnPropertyDescriptor()只能得到自有属性的描述符。想要获得继承属性的特性,需要遍历原型链
3.设置对象属性的特性defineProperty()
要想设置属性的特性,或者想让新建属性具有某种特性,则需要调用Object.defineProperty(),传入要修改的对象,创建或修改的属性的名称以及属性描述符对象
var o = {
x:1,
y:2,
z:3
};// 三个可枚举的自有属性
console.log(Object.getOwnPropertyDescriptor(o,"x"));
for(let i in o){
console.log("属性名称为" + i + "的值为:" + o[i]);//x,y,z都输出来了
}
Object.defineProperty(o,"x",{
enumerable:false
});
console.log("重新设置了属性的特性");
console.log(Object.getOwnPropertyDescriptor(o,"x"));
for(let i in o){
console.log("属性名称为" + i + "的值为:" + o[i]);//x不会输出来,因为x已经无法遍历了
}
对象的方法
1.对象的方法
对象的属性值的类型可以任意,如果某个对象的属性的值的类型是函数的话,那么我们把这个值为函数的属性名称称之为对象的方法
var o = {
x:"hello",
y:function(str){
console.log(str);
}
}
o.y("world");
输出world,属性y是对象o的方法
2.对象的方法this
函数中的this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用是,this等于那个对象,不过,匿名函数的执行环境具有全局性,因此其this对象通常指向window
var o = {
x:"hello",
y:function(str){
console.log(this);//输出对象o
}
}
o.y();
function fn(){
console.log(this);//输出对象window
}
fn();
3.对象访问器属性之getter和setter
访问器属性不包含数据值,他们包含一对getter和setter函数(不过,这两个函数都不是必须的)。在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值;写入访问器属性时,会调用setter函数并传入新值,这个函数负责决定如何处理数据