js函数

  1.文档解析顺序: 从上到下
  1. 函数声明 function   name( ) { 语句  }
  2. 函数调用  函数名( ); 函数名代表整个函数.
  3. 函数表达式的函数名是前面的变量,等号后的函数名只能在函数体使用(调用自身)超出函数外无效.
  4. 函数返回值  return;(遇到return就不再往下执行直接返回)
  5. 参数 在函数内部使用的参数—形参|在函数体使用相当于定义   调用传入的—实参(不限个数,不限类型,存放在arguments中.
  6. 形参可以由arguments访问或代替;改变arguments的值形参的值也会改变..但arguments的长度由实参的个数决定.
  7. arguments只能在函数内使用超出函数无效.
  8. js的函数没有函数签名—(函数名,形参个数,形参类型)所以没有重载,就是相同的函数名代表一个函数后面的会覆盖前面的函数.可以通过判断传入的arguments的长度弥补.
  9. 变量的传递:基本数据类型是值传递.引用类型是对象的引用传递---函数会改变对象的元素;
  10. 函数的嵌套(一般都有返回值.外部函数要传递内不函数的参数.
  11. 在使用对象的属性做为参数传递时注意对象的取值用[ ]
  12. 函数的属性:1.当没有传递参数时可以设置默认值 方式有if/三元运算/ ||  
  13. function.length形参个数   arguments.length 实参个数
  14. function.name函数名
  15. 特殊的对象 arguments和this//arguments用来存储传进来 的实参arguments.callee指向本函数常用在递归中来防止函数执行与函数名捆绑在一起,当改变函数名的引用时出现错误.(递归用法 实现相同的重复运算 连+,-,*等等 在递归中常用arguments.callee代替函数或函数表达式后面的名字—只能在函数内部使用)
  16. this[基于运行时基于函数的执行环境绑定的]对象调用函数的执行环境对象比如(window/object)没有显式的调用函数就是当前环境对象//一定是一个对象调用该函数  apply(); call();
  17. function.caller指向调用本函数的函数(全剧环境中为null)
  18. 函数的方法 apply();和call();//间接改变函数的执行环境               参数   apply (函数的调用者,[ 数组形式传入函数的参数/arguments] )  call(函数的调用者,参数,参数,参数一个一个传递)    
  立即执行的函数:直接在函数后加(function(){}());尽量使用函数表达式.注意函数名代表的是函数执行后的返回值;    立即执行函数相当于调用了该函数.用来保存当前的变量//在循环中用. 
闭包:
环境:指的是调用函数的对象.分为全局环境和函数内部的局部环境
作用域:指的是变量的作用域
 
链式作用域; 一级一级往上找.由内向外不能有外向内
 注意:使用数组和对象时的数据类型 字符串/数值
闭包定义为函数内部的函数.
闭包的特点:能够应用函数内部的参数; 能够在函数外部执行
闭包的用途:1.读取函数内部的变量2.保存诞生环境的变量 
 
面向对象编程,就是把现实生活中的各种复杂的关系,抽象为一个对象,然后由对象之间的分工与合作来完成对现实生活的抽象。
        // 面向对象是相对于传统的面向过程编程而言的。
        // 对象是什么?
        // 1.对象是对单个具体实物的抽象
        // 2.对象是一个容器,容器内部封装了属性(对象的状态:姓名,身高,体重...)和方法(对象的行为:吃,喝,玩...)
        // 3.对象是一个无序的数据集合(属性:属性名称)
定义对象的方法:
1.字面量 {};
2.工厂模式 创建函数function(){create object} 缺点:对象类型不明确,不能使用函数特有原型对象
 
构造函数的使用:1.new 关键字  2.函数首字母大写 3.返回值是一个对象 .
 
 
系统原生的构造函数:
var object=new Object();
缺点:创建的对象不能实现属性和方法的共享
自定义的构造函数:this对象(当使用new时this指的是新创建的对象//不使用new时this指的是函数的调用者—往调用者中添加属性,无返回值.
缺点是:忘记使用new会导致全局环境混乱.//构造函数中判断this对象          if (!(this instanceof Student1)) {
                return new Student1();
            }
instanceof语句  检测对象类型//判断某个实例是否属于某个类型;
自定义的构造函数
function A(){
     this. = ;
     this. = ;
     this. = ;
     this. = ;
     this. = ;
     this. = }
使用构造函数会有4个步骤;
1.创建新对象
2.将构造函数 的作用域赋给新对象
3.往对象中添加属性
4.返回新对象
 
原型:
创建函数的时候都有prototype属性.指向调用函数时创建的实例的原型对象.原型对象中保存着实例共享的属性和方法
原型对象中有一个constructor属性指向构造函数
function.prototype.isPrototypeOf( );判断某个对象的原型;
Object.getPrototypeOf(p);//获取某个对象的原型对象
对象实例.hasOwnProperty( 属性名)//判断某个对象内部是否拥有某个属性.
注意在对原型重新赋值的时候,constructor不在指向原构造函数.——objiect.
可以在赋值中对constructor重新定义指向原构造函数.
原型的缺点:
1.不能传递参数
2.一旦修改,原型的值会影响其他对象.
 
实例的__proto__属性指向原型对象.但不建议正规场合使用. 
第一种继承方式:构造函数继承,在构造函数内部调用其他构造函数,相当于往里面添加属性.//调用用 call(this,); apply(this)  无论构造函数和原型的变量 前都要加this.
这点容易犯错.
优点:1.不会改变原来函数的属性和方法.  2.可以传递参数
缺点:不能实现共享.无法获取对象的原型中的属性.
第二种:原型继承:
子实例的原型对象=父构造函数的一个实例;//
子实例继承父的所有属性和方法.
原型链: 先在本实例中找———原型链寻找———一直到object
原型继承特点:原型中的方法和属性共享..不能传递参数
组合继承:
利用构造继承和原型继承的优点,把不需要共享的/不相同的方法和属性放到.构造函数中,(可以传递参数);把共享的放在原型链中;
注意:在继承中一定要先继承(调用父函数/改原型对象),否则会出现同名方法和属性覆盖.或在新原型对象中不存在.
class继承:
 
 
        class Student2{
            constructor(name){
                this.name = name;
            }
 
            hello(){
                console.log(this.name + '早上好');
            }
        }
定义不同的类; 封装在class中.
继承:class Student3 extends Student2{
constructor( ){    
     super();//调用继承类的构造函数;
}
}
属性放在constructor中.方法放在类中.
通过constructor.prototype获取其他被覆盖的属性 
 
Object.defineProperty(object,”属性名”,{value.....} )
1.数据属性
     [configurable] :
     设置能否用 delete
    改为false后不能再设置除writable以为的属性
     [writable]:
     设置属性能否写入值
     [enumerable]
     设置属性能否用for-in 遍历
     value:为属性设置值;默认undefine
     //默认用字面量声明的对象,上面的属性值都为true
          用Object.defineProperty()设置的属性值默认为false
2.访问器属性
 Object.defineProperty(object,propertyName,{
     get:function(){
     return 属性名;
   }
     set:function(value){
     属性名=value;
   }
}); 
posted @ 2016-10-13 14:19  琴悠  阅读(148)  评论(0)    收藏  举报