1.封装
封装就是把抽象出的属性和对属性的操作封装在一起,属性被保护在内部,程序的其他部分只有通过被授权的操作(函数),才能对属性进行操作:
function Person(name,agei,sal)
{
this.name = name; //公开的属性
var age = agei; //私有的属性
var salary = sal; //私有的属性
this.show=function() //公开方法(特权方法),如果想访问私有属性,可以使用公开方法
{
window.alert(age+" "+salary);
}
function show2() //私有方法(内部方法),可以访问对象的属性
{
window.alert(age+" "+salary);
}
}
var p = new Person("cuizhiquan",20,20000);
window.alert(p.name);
p.show();
2.继承
JS中是通过对象冒充来实现继承的,JS中没有extends关键字:
function Stu(name,age)
{
this.name=name;
this.age=age;
this.show=function()
{
window.alert(this.name+ " " + this.age );
}
}
function MidStu(name,age)
{
this.stu=Stu;
this.stu(name,age); //这两句实现继承
}
function Pupil(name,age)
{
this.stu=Stu;
this.stu(name,age); //这两句实现继承
}
var midStu=new MidStu("cuizhiquan",20);
midStu.show();
3.多态
JS不支持重载,因为JavaScript中的方法本身就是带可变参数的,JS支持覆盖或者称为改写,就是指子类中定义的方法替换掉父类中同名的方法:
function Stu(name,age)
{
this.name=name;
this.age=age;
this.show=function()
{
window.alert(this.name+ " " + this.age );
}
}
function MidStu(name,age)
{
this.stu=Stu;
this.stu(name,age);
this.show=function() // 覆盖父类中的show方法
{
window.alert("MidStu show()");
}
}
var midStu=new MidStu("cuizhiquan",20);
midStu.show();
所谓多态就是指一个引用(类型)在不同情况下的多种状态,在Java中,多态是指通过指向父类的引用,来调用在不同子类中实现的方法,JS是动态语言,是无态的,一个变量的类型是在运行过程中由JS引擎决定的,所以说,JS天生就支持多态。例子一:
function Person()
{
this.test = function()
{
window.alert("Person test");
}
}
function Cat()
{
this.test = function()
{
window.alert("Cat test");
}
}
var v = new Person();
v.test();
v = new Cat();
v.test();
例子二:function Master()
{
this.feed=function(animal,food)
{
document.write("主人给"+animal.name+"喂"+food.name);
}
}
function Food(name)
{
this.name=name;
}
function Fish(name)
{
this.food=Food;
this.food(name);
}
function Bone(name)
{
this.food=Food;
this.food(name);
}
function Animal(name)
{
this.name=name;
}
function Cat(name)
{
this.animal=Animal;
this.animal(name);
}
function Dog(name)
{
this.animal=Animal;
this.animal(name);
}
var cat = new Cat("小猫");
var dog = new Dog("小狗");
var fish = new Fish("小鱼");
var bone = new Bone("小骨头");
var master = new Master();
master.feed(cat,fish);
master.feed(dog,bone);
4.闭包
JavaScript闭包就是在另一个作用域中保存了一份它从上一级函数或作用域取得的变量(键值对),而这些键值对不会随上一级函数的执行完成而销毁:
function a()
{
var i = 0;
function b()
{
window.alert(++i);
}
return b;
}
var c = a(); //i被闭包
a();// 如果这样调用a则不会形成闭包,i被销毁
在上面的代码中,执行完var c = a()后,变量c实际上只指向了函数b,而b中用到了变量i,这段代码其实就创建了一个闭包,因为函数a外的变量c引用了函数a内的函数b,就是说,当函数a的内部函数b被函数a外的一个变量引用时,就创建了一个所谓的闭包。