javascript基本知识

1、多态

多态:
指同一操作操作在不同对象上,可以产生不用的解释和不同的执行结果。

例:

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()); //咯咯咯

理解:
同一个发出叫声命令,在鸭子和小鸡这两种动物身上,产生两种不同的结果,一种发出’嘎嘎嘎‘,一种’咯咯咯‘两种不同的叫声。

2、封装

封装:
封装就是将信息隐藏,狭义的封装指封装数据和实现,广义的封装还包括封装类型和变化。
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、封装变化:指把系统中稳定不变的部分和容易变化的部分隔离开来,在系统演变过程中,我们只需要替换那些容易变化的部分。同上例

3、继承

继承:
指获取已有对象的属性和方法的一种方式

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

4、apply和call的理解

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

5、闭包

闭包指通过函数内部函数访该函数的内部变量的词法环境

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

你可能感兴趣的:(js,技术积累)