JavaScript高级特性
一,函数
1,Argument对象
<1>JavaScript特性
在JavaScript中存在函数的重载,当定义多个同名函数时,计算机只会编译运行最后一个函数。
在JavaScript中函数定义没有任何参数,调用该函数时,可以传递任意参数。
<2>Argument对象作用
1,Argument对象是数组对象
2,Argument对象的length属性:获取函数实参的个数
3,Argument对象特性是实现重载效果
eg:
function add(){
if(argument.length == 2){
return argument[0] + argument[1];
}else if(argument.length == 3){
return argument[0] + argument[1]+argument[0];
}
}
alert(add(1,2)); 输出:3
alert(add(1,2,3)); 输出:6
2,变量作用域
<1>JavaScript特性
1,一次性定义代码中所有变量
2,全局变量与局部变量同名时,在函数域中只能访问局部变量
3,在定义局部变量时,需要使用var
<2>函数作用域
1,作用域:全局域、函数域
2,变量:
(1)全局变量:全局域 + 函数域
(2)局部变量:当前函数域
3,特殊函数
<1>函数三种定义方式
1,function 函数名(){}
2,var 函数名 = function(参数){}
3,var 函数名 = new Function(参数,函数体);
<2>匿名函数
1,定义:没有名的函数被称为匿名函数。
2,格式:var 对象名 = function() {}
3,作用:
(1)将匿名函数作为参数,传递给另一个函数。
(2)使匿名函数完成一次性任务。
eg:
var one = function(){return 1;}
var two = function(){return 2;}
function fn(a , b){
return a()+b();
}
输出:3
<3>回调函数
定义:
1>将一个函数作为参数传递另一个函数,被当做参数的函数称为回调函数。
2>将一个匿名函数作为参数传递另一个函数,被当做参数的函数称为匿名回调函数。
eg:
function fn(a , b){
return a()+b();
}
alert(function(){return 1;},function(){return 2;});
<4>自调用函数
(function 函数名(){
方法体;
}
)();
第一个小括号:封装函数
第二个小括号:调用函数
二,闭包
<1>作用域链:变量的作用域具有传递传递性
<2>定义:函数可以使用函数之外定义的变量
<3>功能:
(1)降低代码之间的耦合度
(2)局部变量的共享
(3)提高安全性
eg:
var a = "a";
var n; //只定义,不初始化,为全局变量
function fn(){
var b = "b";
n = function(){
var c = "c";
alert(a);
alert(b);
alert(c);
}
n();
}
fn();
alert(a);
n();
三,对象
1,定义对象方式
<1> var 对象名 = new Object();
<2> var 对象名 = {key:value1,key:value2}
<3> 函数对象:function 对象名(){}
2,对象属性和方法
普通对象
<1>调用:
(1)对象名.属性名
(2)对象名.方法名
<2>修改:
(1)对象名.属性名 = 新属性
(2)对象名.方法名 = 新方法
<3>增加:
(1)对象名.新属性名 = 新属性
(2)对象名.新方法名 = 新方法
<4>删除:
(1)delete 对象名.属性名
(2)delete 对象名.方法名
函数对象
调用:
var 对象名 = new 函数对象();
其他方式同上
函数对象与函数区别:使用this,指代当前函数对象名,其中this作用替代上下文环境。
四,原型(prototype)
函数本身是一个对象,原型就是函数对象的一个属性。
1,功能作用
利用原型为函数对象和内建函数添加属性和方法。
2,要点解析
在创建了函数对象时,原型自动创建。
3,调用原型
格式:
函数对象.prototype
4,原型应用
在创建构造函数时,可以将对象共有属性和方法,统一添加到构造函数的原型对象中,这样的做法可以避免大量的全局声明污染到全局作用域。
eg:
function Hero(){} //定义函数对象
Hero.prototype = {
name:"zhangsanfeng",
mySayMe:function(){
alert("this is a hero!")
}
}
var hero = new Hero(); //创建对象
五,继承
示例:
//定义A构造函数
function Animal(){
this.species = "动物";
}
//定义B构造函数
function Cat(){
this.name = name;
this.color = coler;
}
1,构造函数绑定
语法功能:
使用call或者apply方法,将父对象的构造函数绑定在子对象上。
eg:
function Cat(name,color){
Animal.apply(this,arguments);
this.name = name;
this.color = color;
}
var catone = new Cat("大旺","黄色");
alert(catone.species); //output:动物
在这里插入代码片
2,prototype模式
语法功能:
使用prototype属性,让B函数的原型对象指向A函数的实例,则B函数的原型对象继承了A函数
Cat.prototype = new Animal();
Cat.prototype.construetor = Cat;
var catone = new Cat("大旺","黄色");
alert(catone.species);output:动物
其中construetor是prototype对象的属性,作用是指向它的构造函数,这里需要重定向构造函数指向Cat函数。
3,直接继承prototype
语法作用:
把不变的属性值直接写在A函数原型上中,再将B函数的原型对象指向A函数原型对象完成继承。
eg:
function Animal(){}
Animal.prototype.species = "动物";
Cat.prototype = Animal.prototype;
Cat.prototype.construetor = Cat;
var Catone = new Cat("大旺","黄毛");
alert(catone.species); output:动物
4,空对象中介
语法作用:
创建第三方空对象,将空对象原型指向A函数原型,再将B函数原型指向空对象实例完成继承。
eg:
var f = function(){};
f.prototype = Animal.prototype;
Cat.prototype = new f();
Cat.prototype.construetor = Cat;
5,拷贝继承
eg:
function extendCopy(){
var z = {};
for(var i in p){
z[i] = p [i];
}
z.uber = p;
retuen z;
}
var a = {name:"a"}
var b = extendCopy(a);
b.tostr = function(){return this.name;}
alert(b.tostr());