- 私有变量 在对象内部使用'var'关键字来声明,而且它只能被私有函数和特权方法访问。
- 私有函数 在对象的构造函数里声明(或者是通过var functionName=function(){...}来定义),它能被特权函数调用(包括对象的构造函数)和私有函数调用。
- 特权方法 通过this.methodName=function(){...}来声明而且可能被对象外部的代码调用。它可以使用:this.特权函数() 方式来调用特权函数,使用 :私有函数()方式来调用私有函数。
- 公共属性 通过this.variableName来定义而且在对象外部是可以读写的。不能被私有函数所调用。
- 公共方法 通过ClassName.prototype.methodName=function(){...}来定义而且可以从对象外部来调用。
- 原型属性 通过ClassName.prototype.propertyName=someValue来定义。
- 静态属性 通过ClassName.propertyName=someValue来定义。
首先简单介绍下javascript的对象:在javascript中对象的种类,Object,Function,还有就是内置对象如String,Array,Date等,在
javascript中内置对象都是继承自Object类。
对象的创建方式
- var obj = new Object(); //传统的对象 内置对象也是这么创建的
- var obj = {}; //无类型对象
我们通常使用的函数都是Function类的实例. 即我们可以这样定义一个函数对象
- var add = new Function("a","b","return a+b");
上面的函数对象等同于
- function add(a,b){
- return a+b;
- }
上面这些是很基本的,如果要了解更深大家可以看javascript的书籍,我就不讲了。
面说下基于函数的面向对象的 成员和方法的访问域的解释.
- //构造函数
- function myConstructor(message){
- //公有属性
- this.myMessage = message;
- //私有属性
- var separator = '_';
- var myOwner = this;
- //构造函数内私有方法
- function alertMessage(){
- alert(myOwner.myMessage);
- }
- alertMessage();
- //特权方法 可以访问构造函数里的私有变量
- this.appendToMessage = function(string){
- this.myMessage += separator + string;
- alertMessage();
- }
- }
- //公有方法
- myConstructor.prototype.clearMessage = function(str){
- this.myMessage = "";
- }
- //静态成员
- myConstructor.name = "jeff";
- //静态方法
- myConstructor.alertName = function (){
- alert(this.name)
- }
- var obj = new myConstructor("hello !");
- obj.appendToMessage("kate");
这段代码创建了一个构造函数myConstructor,它本身也是一个Function对象的实例。我们在程序中面向对象把它看成构造函数 最后使用的是 myConstructor的实例,javascript中没有类这个概念 ,我们这时候可以把它理解为java中的类
在构造函数中
第1行定义了一个特权属性myMessage( 实例对象和子类对象实例可以访问 )
- //创建子类
- function sub(message){
- //继承 myConstructor
- myConstructor.call(this,message);
- }
- var subObj = new sub("jame");
- alert(subObj.myMessage);
第2行定义了两个私有的属性( 在私有方法和特权方法内可以访问,在原型的公有方法不能访问) ,
第4行定义了一个私有方法alertMessage,接着在构造函数里调用
最后定义了appendToMessage特权方法( 实例对象可以访问和子类对象实例也可以访问如下 )
- subObj.appendToMessage(" hello");
接着定义了公有方法clearMessage是扩展了原型对象, 这样的方法适用于所有new出来的实例及子类的实例
这里需要注意的是 静态成员和静态方法只能当前的实例对象能访问也就是 new myConstructor()的实例对象可以访问,在子类中不允许访问 .调用如下
- alert(myConstructor.name); //静态成员
- myConstructor.alertName(); //静态方法