一、this
浏览器在调用函数时,每次会向函数内部传递一个隐形参数,this.
this指向一个对象,该对象称为执行函数的上下文对象。
根据函数调用方式的不同,this会指向不同的对象
function fun(){
console.log(this);
}
//以函数的形式调用,this就是window
fun();//window
var obj = {name:"Ann", sayName:fun};
console.log(obj.sayName == fun);//true
//以方法的形式调用,this就是调用方法的那个对象,现在this是obj
obj.sayName();//Object
以构造函数的形式调用时,this是那个新创建的对象
二、构造函数
执行步骤:1-创建一个新的对象 2.将新建的对象作为函数中的this 3-逐行执行构造函数中的代码 4-将新建对象作为返回值返回。
function Person(name, age){
this.name = name;
this.age = age;
}
var pre = new Person("李华",16);
console.log(pre.name, pre.age);
构造函数也是普通函数的一种,与创建一般函数没有区别,但创建构造函数要注意首字母大写。
1.构造函数的创建
function Person(){
}
2.构造函数的调用:普通函数可以直接调用,但构造函数需要用new关键字调用
var pre = new Person();
console.log(pre);
使用一个构造函数创造的对象,我们称为一类对象,也将一个构造函数称为一个类
3.使用instanceof检查一个对象是否是一个类的实例,是返回true,不是返回false
console.log(pre instanceof Person);
优化后
function Dog(name, age){
this.name = name;
this.age = age;
this.sayName = fun
// this.sayName = function(){
// alert("名字"+this.name);
// };每执行一次就会创建一个新的方法,这样太多了
}
function fun(){
alert("名字"+this.name);
}
var dog = new Dog("旺柴", 2);
dog.sayName();
三、原型对象(prototype)
每创建一个函数,解析器都会向函数中添加一个属性prototype
原型对象相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象
我们可以将对象中共有的内容,统一设定到原型对象中
代码示例如下:
function MyClass(){
}
//向MyClass对象的原型中添加属性a
MyClass.prototype.a = 123;
var mc = new MyClass();
var mc2 = new MyClass();
//console.log(mc.__proto__ == MyClass.prototype);true
console.log(mc.a);//结果123
//当访问对象的属性或方法时,先在自身寻找,有就直接使用,没有的话就去原型对象里找,找到返回
// 向mc中添加一个a
mc.a = "mc里的a";
console.log(mc.a);//结果mc里的a
以后在创建构造函数时,可以将统一的对象或方法写到原型对象中,这样就不用分别为每一个对象添加,也不会影响全局作用域。
function MyClass(){
}
var mc = new MyClass();
var mc2 = new MyClass();
//向MyClass中添加name属性
MyClass.prototype.name = "haha";
console.log(mc.name);//结果123
// 使用"name" in mc 检查,即使mc中没有,也会去原型对象中找
//检查mc自身中是否含有name属性,只有自身存在时才会返回true
console.log(mc.hasOwnProperty("name"));//false
原型对象也有原型,当我们想使用一个对象或方法时,会现在它自身寻找,自身寻找不到再去原型中寻找,原型中找不到去原型的原型寻找,找到object的原型再找不到就不找了,返回undefined
四、数组
数组(Array)是一个内建对象。与普通对象一样,存储一些值;数组是用数字存储索引(index)
1.创建与赋值
//1.创建数组对象
var arr = new Array();
//2.向数组中添加数据
arr[0] = 10;
console.log(arr);
//创建并添加数据
var arr = [1,2,3,4];
console.log(arr);
–length
数组名.length可以获取数组的长度
修改length的长度,修改后的数组长度>原来的,那么多余的数组部分会空出来;修改后的数组长度<原来的,那么多余的数组部分会被删除掉
–四个方法
1)push()方法,向数组的末尾添加一个或多个元素,并返回数组的长度
//arr.push(66);
arr.push(7,8,9);
//Array(7) [ 1, 2, 3, 4, 7, 8, 9 ]
2)pop()方法,删除数组的最后一个元素,并返回
arr.pop();//Array(6) [ 1, 2, 3, 4, 7, 8 ]
result = arr.pop();
console.log("result="+result);//返回的是被删除的那个数据
3)unshift()方法,像数组的0号位插入一个数据
arr.unshift(5);
//Array(8) [ 5, 1, 2, 3, 4, 7, 8, 9 ]
4)shift()方法,删除数组的第一个元素,并将被删的元素作为返回值返回
五、函数的方法
1.Call和apply方法
apply和call是函数对象的方法
function fun(){
alert(this);
}
var obj = {};
//fun 函数对象
fun.call(obj);//可以通过参数指定this
2.argument
函数调用时,解析器会传递两个隐含的数据,一个是this,一个是arguments,封装实参的对象,类数组对象,有索引也有长度
function fun(){
console.log(arguments.callee);
}
//callee对应的函数对象是当前正在指向的函数对象
fun();