一,函数

使用函数声明创建一个函数:

  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;

  }