javascript中的私有,公有,特权和静态方法
2010-08-01 15:54
471 查看
javascript的函数既可以作为普通的函数进行调用,也可以作为构造函数进行创建对象。在作为普通函数进行调用的情况,由于大家比较熟悉,并且平时使用也比较多,所以这里就不做进一步的阐述了,本文重点是分析javascript函数作为一个构造函数进行创建对象的过程和在构建高可复用的框架的一些技巧tips。
我们知道,调用构造函数创建一个javascript的对象过程是很容易的,实例代码如下:
var myObj = new myConstructor(); //这里当然可以传递一些参数;
但如果拆分new 操作符对应的函数调用系列,可以拆分理解成下列的执行步骤:
var myObj = new Object(); //创建一个本地的javascript native object
myConstructor.call(myObj); //把当前创建的对象作为myConstructor的this参数并且调用构造函数进行初始化;
myObj[[prototype]] = myConstructor.prototype; //把myConstructor的prototype的引用赋给对象myObj的内部原型属性
通过第三步骤的赋值,使得通过prototype增加的函数均在构造的各个实例中都是可访问的,并且只保留一份拷贝。
有了上面的预备知识,下面理解私有,公有,静态和特权成员就比较容易了。还是以例子代码为例。
//构造函数如下
function myContructor(info) {
this.info = info; //这是实例的属性,并且是公有的,每new 一个实例都生成一个新的属性
//这个是私有的属性,对每new一个的实例来说,是不可见的,但构造函数执行完毕就消失了,
//注意这里的var 关键字
var _innerVar = 'this is private var';
//这个是私有方法,同样对每new一个实例来说,也是不可见的,只在构造函数的执行过程中可见
//私有方法可以使用私有属性和实例的各个属性
function _innerFn(){
//TODO HERE
};
_innerFn();
//特权方法,本身也是公有的方法,任何生成的实例都可以调用,但这里之所以称为“特权”方法,是因为该方法
//由于放到了构造函数的内部,使得具有权限访问构造函数执行过程的作用域链的各个属性和函数,包括私有属性
//和私有方法,但同时由于作为实例的一个成员方法,每new一个对象,都会创建一个单独的特权方法的拷贝,
//从根本目的上看,特权方法的存在是为了访问私有方法和私有属性并且发布为实例的公共成员方法。这里其实
//已经形成了一个闭包
this.specialFn = function(){
_innerFn();
this.message = this.info + _innerVar;
};
};
//通过prototype实现的方法均是公有方法,并且每个实例都共享一份拷贝,通过上面的new的拆分过程可以理解到这点。
myConstructor.prototype.publicFn = function(){};
//静态方法
myConstructor.staticFn = function(){};
//静态成员
myConstructor.staticVar = 'abc';
其实静态方法只是作为function对象实例自身的一个成员方法和成员函数而言,跟构造函数本身没太大的关系,常用于定义常量和保持唯一值的存储,比如Math.PI等。
我们知道,调用构造函数创建一个javascript的对象过程是很容易的,实例代码如下:
var myObj = new myConstructor(); //这里当然可以传递一些参数;
但如果拆分new 操作符对应的函数调用系列,可以拆分理解成下列的执行步骤:
var myObj = new Object(); //创建一个本地的javascript native object
myConstructor.call(myObj); //把当前创建的对象作为myConstructor的this参数并且调用构造函数进行初始化;
myObj[[prototype]] = myConstructor.prototype; //把myConstructor的prototype的引用赋给对象myObj的内部原型属性
通过第三步骤的赋值,使得通过prototype增加的函数均在构造的各个实例中都是可访问的,并且只保留一份拷贝。
有了上面的预备知识,下面理解私有,公有,静态和特权成员就比较容易了。还是以例子代码为例。
//构造函数如下
function myContructor(info) {
this.info = info; //这是实例的属性,并且是公有的,每new 一个实例都生成一个新的属性
//这个是私有的属性,对每new一个的实例来说,是不可见的,但构造函数执行完毕就消失了,
//注意这里的var 关键字
var _innerVar = 'this is private var';
//这个是私有方法,同样对每new一个实例来说,也是不可见的,只在构造函数的执行过程中可见
//私有方法可以使用私有属性和实例的各个属性
function _innerFn(){
//TODO HERE
};
_innerFn();
//特权方法,本身也是公有的方法,任何生成的实例都可以调用,但这里之所以称为“特权”方法,是因为该方法
//由于放到了构造函数的内部,使得具有权限访问构造函数执行过程的作用域链的各个属性和函数,包括私有属性
//和私有方法,但同时由于作为实例的一个成员方法,每new一个对象,都会创建一个单独的特权方法的拷贝,
//从根本目的上看,特权方法的存在是为了访问私有方法和私有属性并且发布为实例的公共成员方法。这里其实
//已经形成了一个闭包
this.specialFn = function(){
_innerFn();
this.message = this.info + _innerVar;
};
};
//通过prototype实现的方法均是公有方法,并且每个实例都共享一份拷贝,通过上面的new的拆分过程可以理解到这点。
myConstructor.prototype.publicFn = function(){};
//静态方法
myConstructor.staticFn = function(){};
//静态成员
myConstructor.staticVar = 'abc';
其实静态方法只是作为function对象实例自身的一个成员方法和成员函数而言,跟构造函数本身没太大的关系,常用于定义常量和保持唯一值的存储,比如Math.PI等。
相关文章推荐
- 从声明方式看Javascript的4种方法的区别-公有方法、私有方法、特权方法和静态方法
- Javascript 构造函数,公有,私有特权和静态成员定义方法
- javascript中的私有,公有,特权和静态方法
- JavaScript面向对象-静态方法-私有方法-公有方法-特权方法
- JavaScript面向对象-静态方法-私有方法-公有方法-特权方法
- JavaScript【面向对象】-静态方法-私有方法-公有方法-特权方法
- Javascript中的公有、私有、特权和静态成员
- JavaScript中的公有、私有、特权和静态成员用法分析
- JavaScript中的公有、私有、特权和静态成员用法分析
- javascript 原型方法,对象方法,类方法;私有属性,公有属性,公有静态属性
- Javascript 面向对象(共有方法,私有方法,特权方法,静态属性和方法,静态类)示例讲解
- javascript公有成员定义、私有成员定义、特权方法定义的简单示例
- javaScript【创建对象、创建类、成员变量、方法、公有和私有、静态】
- JS类定义:涵盖了javascript公有成员定义、私有成员定义、特权方法定义的简单示例
- js面向对象之公有、私有 、静态方法和属性,以及特权方法
- Javascript基础(公有方法、私有方法、特权方法)
- JavaScript 对象方法 类方法 原型方法的区别;私有属性 公有属性 公有静态属性的区别
- JavaScript 对象方法 类方法 原型方法的区别;私有属性 公有属性 公有静态属性的区别
- javascript封装类的技巧:具有私有成员、私有方法、特权属性、特权方法、原型对象、静态成员,最重要的是不会失去封装的优点,并且不影响继承