多态:
指同一操作操作在不同对象上,可以产生不用的解释和不同的执行结果。
例:
var makeSound = function (animal){
if( animal instanceof Duck ){
consloe.log('嘎嘎嘎')
}else if( animal instanceof Chilken ){
consloe.log('咯咯咯')
}
}
var Duck = function(){};
var Chicken = function(){};
makeSound(new Duck()); //嘎嘎嘎
makeSound(new Chicken()); //咯咯咯
理解:
同一个发出叫声命令,在鸭子和小鸡这两种动物身上,产生两种不同的结果,一种发出’嘎嘎嘎‘,一种’咯咯咯‘两种不同的叫声。
封装:
封装就是将信息隐藏,狭义的封装指封装数据和实现,广义的封装还包括封装类型和变化。
1、封装数据:通过函数的作用域来实现数据的不同访问权限。
var myObject = (function(){
var name = 'liyang'; //私有变量
return {
getName: function(){ //公开方法
return name;
}
}
})()
console.log( myObject.name ); //undefined
console.log( myObject.getName() ); //liyang
2、封装实现:是使对象内部变化对其他对象不可见,通过对外暴露API接口来实现通信,例如add函数等
var add = function(x,y){
return x+y;
}
console.log( add(1,2) );
3、封装类型:通过抽象类和接口来进行的,把对象的真正类型隐藏在抽象类或接口之后,客户更关心对象的行为。
var makeSound = function(animal){
if( animal.sound instanceof Function ){
animal.sound();
}
}
var Duck = function(){};
Duck.prototype.sound = function(){
console.log('嘎嘎嘎');
}
var Chicken = function(){};
Chicken.prototype.sound = function(){
console.log('咯咯咯');
}
makeSound(new Duck()); //嘎嘎嘎
makeSound(new Chicken()); //咯咯咯
4、封装变化:指把系统中稳定不变的部分和容易变化的部分隔离开来,在系统演变过程中,我们只需要替换那些容易变化的部分。同上例
继承:
指获取已有对象的属性和方法的一种方式
var Person = function(name){
ClassName.call(this,2);
this.name = name;
}
var ClassName = function(target){
this.classNum = target;
}
Person.prototype = new ClassName(); //一个对象的原型等于一个对象的实例,此时person对象就继承了ClassName对象的属性和方法
var p1 = new Person('zhangsan');
console.log(p1.name); //zhangsan
console.log(p1.classNum); //2
apply和call都是改变this的指向,是ECAMScript3的Function(函数)原型上定义的两种方法,原始代码是Function.prototype.apply和Function.prototype.call。他们的作用相同,但参数不同。
apply接收两个参数,第一个指定了Function的this对象的指向(可选),第二个为数组或类数组对象;
call也接收两个参数,第一个指定了Function的this对象的指向(可选),第二参数开始为传入的参数,个数不固定
var obj = {
name: 'zhangsan'
}
var A = function(){
console.log(this.name); //zhangsan
console.log(arguments); //1,2
}
A.apply(obj,[1,2]);
A.call(obj,1,2);
//执行过程:函数A的this被改变成了obj,并传入了两个参数1和2,与此同时调用了函数A,其中this.name即为obj.name,arguments即为参数1和2
闭包指通过函数内部函数访该函数的内部变量的词法环境
var A = (function(){
var num = 1;
return function(){
return num++;
}
})()
A(); //1
A(); //2
闭包的作用:
1、利用闭包可以把全局变量封装为“私有变量”;
2、利用闭包可以延续局部变量的寿命(函数的局部变量是在函数调用结束后被销毁的),这样就可以防止在函数调用结束后销毁
闭包的回收
var A = (function(){
var num = 1;
return function(){
return num++;
}
})()
A(); //1
A(); //2
A = null //回收闭包
A(); //Uncaught TypeError:A is not a function