js函数
1.文档解析顺序: 从上到下
- 函数声明 function name( ) { 语句 }
- 函数调用 函数名( ); 函数名代表整个函数.
- 函数表达式的函数名是前面的变量,等号后的函数名只能在函数体使用(调用自身)超出函数外无效.
- 函数返回值 return;(遇到return就不再往下执行直接返回)
- 参数 在函数内部使用的参数—形参|在函数体使用相当于定义 调用传入的—实参(不限个数,不限类型,存放在arguments中.
- 形参可以由arguments访问或代替;改变arguments的值形参的值也会改变..但arguments的长度由实参的个数决定.
- arguments只能在函数内使用超出函数无效.
- js的函数没有函数签名—(函数名,形参个数,形参类型)所以没有重载,就是相同的函数名代表一个函数后面的会覆盖前面的函数.可以通过判断传入的arguments的长度弥补.
- 变量的传递:基本数据类型是值传递.引用类型是对象的引用传递---函数会改变对象的元素;
- 函数的嵌套(一般都有返回值.外部函数要传递内不函数的参数.
- 在使用对象的属性做为参数传递时注意对象的取值用[ ]
- 函数的属性:1.当没有传递参数时可以设置默认值 方式有if/三元运算/ ||
- function.length形参个数 arguments.length 实参个数
- function.name函数名
- 特殊的对象 arguments和this//arguments用来存储传进来 的实参arguments.callee指向本函数常用在递归中来防止函数执行与函数名捆绑在一起,当改变函数名的引用时出现错误.(递归用法 实现相同的重复运算 连+,-,*等等 在递归中常用arguments.callee代替函数或函数表达式后面的名字—只能在函数内部使用)
- this[基于运行时基于函数的执行环境绑定的]对象调用函数的执行环境对象比如(window/object)没有显式的调用函数就是当前环境对象//一定是一个对象调用该函数 apply(); call();
- function.caller指向调用本函数的函数(全剧环境中为null)
- 函数的方法 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;
}
});
欢迎访问
浙公网安备 33010602011771号