一,函数
使用函数声明创建一个函数:
function 函数名([形参1,形参2,形参3])
{
语句。。。
}
调用的时候:函数名();
使用函数表达式创建一个函数:
var 函数名=function([形参1,形参2])
{
语句。。。
}
var fun3=function()
{
console.log("12345");
}
二,函数的参数
(1)在调用参数时候,可以在()中指定实参,实参将会赋值给函数中对应的形参。
(2)调用函数时解析器不会检查实参的类型和数量,实参可以是任意的类型也可以是一个对象。
var obj={
name:"孙悟空",
age:18,
gender:"男",
address:"花果山"
}
function sayhello(o)
{
console.log(o.name+o.age+o.gender+o.address);
}
sayhello(obj);
三,函数的返回值
(1)一般函数返回一个值就行,不需要进行输出处理。
(2)如果return后面不加值或者无return,就会返回undefined.
fun(mianji(10));//调用函数,相当于使用函数的返回值
fun(mianji);//调用函数对象,相当于直接使用函数对象
四,立即执行函数
函数对象:
(function(){
alert("12345");
})();
以上函数立即执行,不需要调用
obj.sayname();//调方法
fun();//调函数
五,枚举对象中的属性
使用for。。in。。语句
var obj={
name:"孙悟空",
age:18,
gender:"男",
address:"花果山"
}
for(var n in obj)
{
console.log(n);
console.log(obj[n]);//对象[属性名]=属性值;
}
六,作用域
1,全局作用域
直接卸载script标签中的JS语句中,在页面打开是创建,页面关闭时销毁。有一个全局对象window,它代表的是一个浏览器的窗口,它由浏览器创建我们可以直接使用。创建的变量都会作为window对象的属性进行保存。创建的函数都会作为window对象的方法进行保存。
变量的声明提前:使用var关键字声明的变量,会在所有的代码执行之前被声明。但是如果不用var则不会被提前
函数的声明提前:使用函数声明形式创建的函数function函数(){},他会在所有的代码执行之前就被创建
使用函数表达式创建的函数不会被声明提前。
2,函数作用域
在函数作用域中可以访问到全局变量
函数中,不适用var声明的变量都会成为全局变量
七,this
解析器在调用函数每次都会向函数内部传递一个隐含的参数,这个隐含的参数就是this,this指向的是一个对象,这个对象我们称为函数执行的上下文对象,数据函数的调用方法的不同,this会指向不同的对象
(1)以函数形式调用时候,this指的是window,比如fun()
(2)以方法形式调用时候,this指的是当前方法的对象,比如obj.name()
八,使用工厂方法创建对象
function createPerson(name,age,gender)
{
var obj=new Object();
obj.name=name;
obj.age=age;
obj.gender=gender;
obj.sayName=function()
{
alert(this.name);
}
return obj;
}
var obj2=createPerson("猪八戒",28,“男”);
var obj3=createPerson("孙悟空",29,“男”);
console.log(obj2);
console.log(obj3);
九,构造函数
习惯第一个字母大写,普通函数直接调用,构造函数需要使用new关键字调用
构造对象创建过程:
(1)立即创建一个新的对象
(2)将新建的对象设置为函数中this
(3)逐行执行函数中的代码
(4)将新建的对象作为返回值返回
使用instanceof可以检查一个对象是否是一个类的实例
语法:
对象 instanceof 类名
如果是真返回true
所有的对象都是Object的对象,所有的对象做instanceof检查时候都是true。
this情况:
1,当以函数的形式调用的时候,this是window;
2,当以方法的形式调用时,调用方法this就是谁;
3,当以构造函数的形式调用时,this就是新创建的那个对象。
十,原型对象
我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype。这个属性对应着一个对象,这个对象就是我们说的原型对象。
如果函数作为普通函数调用prototype则没有任何作用,当函数以构造函数的形式调用时,他所创建的对象中都会有一个隐含的属性。指向该构造函数的原型对象,我们可以通过__proto__来访问该属性。
原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象,我们可以将对象中共有的内容,统一设置到原型对象中。
当我们访问对象的第一个属性或方法时,他会在对象自身中寻找,如果有直接使用,没有则去原型里找。如果还是没有,则去原型的原型里面找
MyClass.prototype.a=123;//添加原型属性a
var mc=new MyClass();
mc.a;//123
一会后我们创建构造函数中,可以将这些对象共有的属性和方法,同意添加到构造函数的原型中。
使用in 检查对象中是否含有某个属性时,如果对象中没有但是原型中有,也会返回true。如
console.log("name" in mc);
使用hasOwnProperty()来检查对象自身中是否含有该属性,使用该方法只有当对象自身中含有属性时,才会返回true。如
console.log(mc.hasOwnProperty("name"));
console.log(mc.__proto__);
十一,toString
当我们直接在页面上打印一个对象时候,事实上输出的是对象的toString方法
如果创建了多个对象,想要多个对象的toString方法都重写,我们需要在原形里面重写toString方法。如:
Person.prototype.toString=function(){
return "Person[name]="+this.name;
}