基于对象 与 面向对象:
基于对象
具有封装的特性
面向对象
基于对象 并且可以继承 多态
javascript 是基于对象的,每个对象都可以有它独特的属性。但是它的每一个对象
不能被继承。
对象之间存在一种 泛化 的关系,即说明这两个对象是 一类 对象。通过类来声明,这样诞生
的很多对象都是一个类的对象。而在javascript中,有两种方式是不具有这样的 泛化 关系的。
var a = new Object();
a.age = 20;
a.gengder = 'male';
var b = {age:20, gender:'male'};
这样声明的两个对象你能说他们是一类对象吗?
function Cust(a, g)
{
this.age = age;
this.gender = gender;
}
var cust1 = new Cust(20, 'male');
var cust2 = new Cust(22, 'famale');
这样的呢?
在 java c++ 等的面向对象的语言中,都是先有类的声明,后才能有类的对象。
继承 封装 多态 都是在类的声明的基础上进行的改进,所以说面向对象的特性是
基于对象 且 可以继承 实现多态的。
封装 与 闭包
所谓封装,就是指一个类的 属性 或 方法 可以被声明为 共有或私有的,只有共有的
方法和属性才能被外部环境访问。
javascript 函数的对象特征:对象的属性和方法都是共有的 。
javascript 的另一个特征 闭包 就完成了属性和方法的私有化,使得javascript
丝毫不逊色于面向对象的各大语言。
闭包就是利用变量的作用域来控制对象中属性的访问权限。
function Student(name, age)
{
this.name = name;
this.age = age;
var addr = "Address infomation";
}
var stu = new Student("xiaoming", 20);
// 对于外部环境来说,addr 变量是不可访问的。
alert(stu.name + ":" + stu.age); // xiaoming:20
alert(stu.addr); // undefined
我们通过这样的方式来将不公开的属性做以 "封装",就叫做闭包。
在包内,我们声明对象的属性,在包外没有 this 指向的属性都不能被访问。
对象的 getter 和 setter 属性
在java当中,我们通常会给一个私有的属性提供 getter 和 setter 方法来供外部
访问。在javascript当中也一样具有这样的方法,而且javascript当中的getter
还有一种表现形式,它可以表现成为对象的一个属性。
getter 方法模板://先看例子
注意:
getter 属性中不能访问 prototype 类型的属性
getter 方法 可以
this.property =
{
valueOf : function(){return ...},
toString : function(){return ...}
}
例子:
function Student1(name, age, gender)
{
this.name = name;
this.age = age;
this.gender = gender;
// getter 方法的形式获得信息
this.getInfo = function ()
{
return "Hello ! My name is " + name
+ "\n I am " + age + " years old !"
+ "\nI'a " + gender;
}
}
function Student2(name, age, gender)
{
this.name = name;
this.age = age;
this.gender = gender;
//定义成属性 模拟getter方法 来获取信息
this.info =
{
valueOf:function()
{
return "Hello ! My name is " + name
+ "\n I am " + age + " years old !"
+ "\nI'a " + gender;
},
toString:function()
{
return "Hello ! My name is " + name
+ "\n I am " + age + " years old !"
+ "\nI'a " + gender;
}
}
}
var stu1 = new Student1("xiaoming", 22, "male");
var stu2 = new Student2("xiaofang", 21, "famale");
alert(stu1.getInfo()); // getter 方法
alert(stu2.info); // 对象的 getter 属性
对象的setter属性目前只能由 setXxx 方法来实现,目前的 ECMA Script V3 不支持
setter 属性。