对象:对象就是命名的数据的集合
从语法的角度来说,存放内容的属性就像变量一样,而执行动作的方法由函数来完成。因此,对象也可以看成是变量和函数的有机集合,只不过它是以“键:值”对的形式呈现
静态内容,也叫属性(其实就是变量)
形态:名 -> 值 的方式来定义,也叫 键(key)值(value)对
1、如何去定义或者创建对象?
1)字面量对象:
{ }中以 “键 / 值” 对 (键也叫索引)的形式申明属性和方法,以花括号形式定义的对象是字面量对象
对象= {
属性1,
属性2,
方法1,
方法2
}
在编程中,抽象数据和数据处理的方法,先从生活的角度出发,去抽象对象,所有的实体都可以看成对象,抽象它的静态特征,作为属性,动态特征,就是行为方法。
抽象一个人的对象:
静态特征:姓名、性别、年龄、身高、体重
动态行为:唱歌、跳舞、运动、读书、编程
var foo = {
name : "张三"
sex : "男"
age : "18"
height : "180"
sing : function( ) {
return "我在唱歌"
}
reading : function( ) {
return "我在读书"
}
}
// 对象中的成员使用"对象名 . 成员" 来访问
console.log(foo.name + "的年龄是:" + foo.age);
// 打印输出为:张三的年龄是18
console.log(foo.sing());
// 打印输出为:我在唱歌
2)this关键字
对象的成员可以在所有的方法中共享,方法体内访问的对象成员,可以使用this替代当前对象:
var a = {
name: "小白",
getName: function () {
//方法体内使用this替代当前的对象
// 打印输出一下this是否等于a?
// console.log(this=== a); 结果为true
return this.name;
},
};
// 输出console.log(a.getName());结果为小白
3)使用构造器
使用对象的构造函数Object 显示的创建一个对象,构造函数是专门生产对象的函数,一个构造器:
使用构造函数创建对象:构造对象的函数工具 可以看成是对象的模板
普通对象的构造是Object在面向对象语言中 称为"类"(class)
// 使用构造器初始化一个空对象,专业术语叫构造函数,new 表示新生对象
var o = new Object;
// 通过赋值的方式,动态添加成员属性和方法
o.name = "灰太狼";
o.sex = "雄性";
o.age = 18;
o.sayHello = function () {
return this.name + "说到 : 我还会回来的";
// 返回出去的结果是:灰太狼说到:我还会回来的
};
console.dir(o);
console.log(o.name + "的年龄是:" + o.age);
console.log(o.sayHello());
4) 简洁声明的方式:
在es6中,字面量对象的写法更为简洁。当属性值包含在同名的变量是,例如:foo属性定义在变量foo中,那么{foo :foo}可以简写成{foo},称为 “简洁属性”。事实上它省略了左侧的foo
var foo ="hello",
bar = "world";
var o = {
foo: foo, //将变量foo的值给foo属性
bar: bar //将变量bar的值给bar属性
} //当属性和变量同名省略左侧接收值的属性
var o = {
foo,
bar
}
console.log(o);
不仅是属性,方法也有更为简洁的写法且没有任何的前提,所有的方法都可以省略掉:function声明。
// es6+中方法存在三种写法
var o = {
foo: function () { //表达式},
bar: () => { //箭头函数},
baz () { //简洁方法},
}
console.log(o);
5) 动态属性
var a = "baz";
var o = {
foo : "foo",
bar : "bar",
// baz : "baz",
}
// 如果属性名是一个变量的值 早期需要动态的设置该属性
o.a = "baz"; // .后面不解析变量 它认为属性名就是a 不是变量a的值
console.log(o);
// 如果要解析 需要使用[ ]
o[a] = "baz";
console.log(o);
// 现在可以在字面量对象中 直接设置动态属性
var o = {
foo : "foo",
bar : "bar",
// 使用[ ]声明的属性 为一个变量的值
[a] : "hello world"
}
console.log(o);
1.2 对象的特征
1)对象转化
对象是复合类型的数据,它不仅有值更有结构在里面,因此不能直接参与运算和输出。当把一个对象用于字符串环境中时,JS会隐式的调用对象的toString( )方法将它转化成一个字符串后再进行操作;
如果没有自定义的toString( )的方法则对象会从它的隐式原型链继承toString()方法,而隐式原型链都至少包含一个Object.prototype.toString( )方法。该方法返回一个[object Object]的字符串值。前者object为它的类型说明,后者Object则是构造函数名称。
当把一个对象用于数学环境中时,JS会隐式的调用它的valueOf()方法,查询到相应类型的数值后再进行运算,事实上valueOf()的转化过程要复杂很多,这里只做简单的介绍!
2)属性检测
in运算 1.in运算用来检测对象中是否存在某个属性时,返回一个布尔值的结果,运算表达式为"属性" in 对象。表达式左边为属性名称字符串或者能够转化成字符串值得变量,右边为一个对象类型的值。
2. 使用hasOwnProperty的检测方法,而不能检测继承的属性