对象Object
JavaScript 中的所有事物都是对象,如:字符串、数值、数组、函数等,每个对象带有属性和方法。
对象的属性:反映该对象某些特定的性质的,如:字符串的长度、图像的长宽等
对象的方法:能够在对象上执行的动作。例如,表单的“提交”(Submit),时间的“获取”(getYear)等;
JavaScript 提供多个内建对象,比如 String、Date、Array 等等,使用对象前先定义,如下使用数组对象:
var objectName =new Array();//使用new关键字定义对象
//或者
var objectName =[];
对象是一组“键值对”的集合。之间用逗号分隔.
var obj = {
str1: 'Hello',
str2: 'World'
}
console.log(obj.str1)
//str1: 'Hello', 键值对
//str1 键名
//"Hello" 键值
//键名
//所有对象的键名都是字符串。所以加不加引号都代表它是字符串(只能是字符串)
var obj={
100:"键值1"
}
//调用:
//console.log(obj.100) //不成立
console.log(obj[100])
//js中所有的点都可以替换成中括号
//键值
//键值可以是任何数据类型。也可以是函数
var obj={
fn:function(x){
console.log(x)
}
}
//调用:
obj.fn(3) //3
//对象的引用
//对象名.键值 该方法可读可写
var o1 = {};
var o2 = o1;
o1.a = 1;
o2.a // 1
o2.b = 2;
o1.b //2
object属性的操作
//读取属性
var obj = {
str: 'Hello World'
}
obj.str
obj['str']
//使用方括号必须将键名用引号引起来,否则会当做是一个变量
//删除属性
var obj={ a:1,b:2,c:3}
delete obj.c
console.log(obj) //{a:1,b:2}
//这个关键字属性只能作用在对象上
//查看所有属性(查看所有键名)
var obj = {};
obj.a = 'Hello';
obj['b'] = 'World';
console.log(Object.keys(obj))
//['a','b'] 返回一个数组,查看所有键名
//注意O是大写
//检测数据是否在对象中
var obj={a:1,b:2,c:3}
//关键字 in
console.log("a" in obj) //true
console.log("d" in obj) //false
//对象的遍历
var obj={a:1,b:2,c:3,d:"abc"}
var arr=Object.keys(obj)
console.log(arr) // ["a", "b", "c", "d"]
for (var i = 0; i < arr.length; i++) {
console.log(obj[arr[i]]) //1 2 3 abc
}
//先获取键名,然后通过键名去调取键值
//for.. in循环
var obj={a:1,b:2,c:3}
for(var i in obj){
console.log(i) //遍历所有键名
console.log(obj[i]) //遍历所有键值
}
//with语句(with方法,绑定的对象并不明确。只做了解,很少用到。)
//读取或设置对象中的属性
var obj = {p1: 1, p2: 2,};
with (obj) {
p1 = 4;
p2 = 5;
}
// 等同于
obj.p1 = 4;
obj.p2 = 5;
对象中的this
this 永远指向最后调用它的那个对象。默认指向window。
一、方法调用模式
当函数被保存为一个对象的属性时,它就可称为这个对象的方法。
当一个方法被调用时,this被绑定到这个对象上。
如果调用表达式包含一个提取属性的动作(. 或 [])
那么它被称为方法调用。例如:
var name = "window";
var obj = {
name: "kxy",
sayName: function() {
console.log(this.name);
}
}
obj.sayName(); //kxy
//sayName函数作为对象obj的方法调用,所以函数体中的this就代表obj对象。
二、函数调用模式
当一个函数并非一个对象的属性时,那么它就是被当做函数来调用的。
在此种模式下,this被绑定为全局对象,在浏览器环境下就是window对象。例如:
var name = "window";
function sayName() {
console.log(this.name);
}
sayName();
sayName以函数调用模式调用,所以函数体中的this代表window对象。
三、构造函数模式
如果在一个函数前面加上new关键字来调用,那么就会创建一个连接
到该函数的prototype成员的新对象,同时,this会被绑定到这个新对象上。
这种情况下,这个函数就可以成为此对象的构造函数。例如:
function Obj() {
this.name = "kxy";
}
var person = new Obj();
console.log(person.name); //kxy
//Obj作为构造函数被调用,函数体内的this被绑定为新创建的对象person
四、apply调用模式
在JS中,函数也是对象,所有函数对象都有两个方法:apply和call,
这两个方法可以让我们构建一个参数数组传递给调用函数,
也允许我们改变this的值。例如:
var name = "window";
var person = {
name: "kxy"
};
function sayName() {
console.log(this.name);
}
sayName(); //window
sayName.apply(person); //kxy
sayName.apply(); //window
//当以函数调用模式调用sayName时,this代表window;
//当用apply模式调用sayName,并给它传入的第一个参数为person时
//,this被绑定到person对象上。如果不给apply传入任何参数,则this代表window。