变量声明
var声明变量会在最先声明,但不会赋值,返回值为undefind
function声明函数也会在最先声明,但会直接进行定义,可以直接调用
函数有形参相当于提前声明变量
var a=123;
function fun(){
alert(a);
var a=456;
}
fun();
alert(a); //undefind
var a=123;
function fun(){
alert(a);
a=456;
}
fun();
alert(a); //456
var a=123;
function fun(a){
alert(a);
a=456;
}
fun();
alert(a); //undefind 456
构造函数的执行流程
1.立刻创建一个新的对象
2.将创建的对象设置为函数中的this,在构造函数中可以使用this来引用新建的对象
3.逐行执行函数中的代码
4.将新建的对象作为返回值返回
function Person(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
this.sayName=function(){
alert(this.name);
};
}
var per= new Person("孙悟空",18,"男");
console.log(per);
使用同一个构造函数创建的对象,我们成为一类对象,也将一个构造函数称为一个类。
我们将通过一个构造函数创建的对象称为该类的一个实例。
console.log(per instanceof Person);
使用instanceof可以检查一个对象是否是一个类的实例。
所有对象都是object后代,任何对象和object做instanceof都得到true。
call()和apply()
这两个方法都是函数对象的方法,需要通过函数对象来调用
当对函数调用call()和apply()都会调用函数执行
在调用call()和apply()可以将一个对象指定为第一个参数,此时这个对象将会成为函数执行的this
call()方法可以将实参在对象之后一次传递
apply()方法需要将实参封装到一个数组中统一传递
this的情况
- 当以函数形式调用时,this是window
- 当以方法的形式调用时,谁调用方法this就是谁
- 当以构造函数的形式调用时,this就是新创建的对象
- 使用call和apply调用时,this是指定的那个对象
原型prototype
我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype,这个属性对应着一个对象,这个对象就是原型对象。
如果函数作为普通函数调用prototype没有任何作用,当函数以构造函数的形式调用时,他所创建的对象中都会有一个隐含的属性,指向该构造函数的原型对象,我们可以通过_prototype_来访问该属性。
原型对象相当于一个公共区域,所有同一个类的实例都可以访问到这个原型对象,我们可以将对象中共有的内容,统一设置到原型对象中。
当我们访问对象的属性或方法时,它会现在对象自身中寻找,如果有则直接使用,如果没有则会去原型对象中寻找,找到则直接使用
function Myclass(){
}
Myclass.prototype.a=123;
var mc= new Myclass();
var mc2= new Myclass();
mc.a=234
console.log(mc.a); //234
console.log(mc2.a); //123
使用in检查对象中是否含有某个属性时,如果对象中没有但原型中有,也会返回true
console.log("name" in mc);
可以使用对象的hasOwnProperty()来检查对象自身是否含有该属性。
console.log(mc.hasOwnProperty("name"));
原型对象也是对象,它也有原型,当我们使用一个对象的属性和方法时,会在自身中寻找,有则直接使用,没有则去原型对象中寻找,有则直接使用,没有则去原型的原型中寻找,知道找到Object对象的原型,Object对象的原型没有原型。
console.log(mc.__proto__.__proto__.__proto__);//null
tostring()方法
当我们直接在页面中打印一个对象时,实际上输出的是对象的tostring()方法的返回值。
如果我们希望在输出对象时不输出[object object],可以为对象添加一个tostring()方法
per.tostring=function(){
return "Person[name="+this.name+",age="+this.age+",gender="+this.gender+"]"
}
或者直接修改原型中的tostring()方法
Person.prototype.tostring=function(){
return "Person[name="+this.name+",age="+this.age+",gender="+this.gender+"]"
}
垃圾回收
当一个对象没有任何的变量或者属性对它进行引用,此时我们将永远无法操作该对象,此时这种对象就是一个垃圾,这种对象过多会占用大量空间,使程序运行变慢,所以必须进行清理。
在js中有自动的垃圾处理机制,会自动的将这些垃圾对象从内存中销毁。
我们不需要也不能进行垃圾回收的操作
我们只需要将不再使用的对象设置为null即可