随身笔记
随身笔记

js面向对象的私用属性方法和对外接口

JavaScript面向对象编程中私有成员、静态成员的实现要比Java、ActionScript、Python要复杂的多,现在摘抄一些《JavaScript设计模式》中的代码来做演示。

私有属性和方法

var Book = function(newName){
// 私有属性
var name;

// 私有方法
function checkName(name){
// …
}

// 特权方法
this.getName = function(){
return name;
};

// 特权方法
this.setName = function(newName){
name = newName || ‘No Name’;
};

// 构造代码
this.setName(newName);

};

var book01 = new Book(‘name01’);
console.log(book01.getName()); // 输出 ‘name01’
book01.setName(‘newName01’);
console.log(book01.getName()); // 输出 ‘newName01’

在本例中用var声明私有变量,这意味着它们只存在于Book构造器,checkName函数也是用同样的方法声明的,因此成了一个私有属性。

要想访问这些私有属性和方法的函数只需声明在Book中即可,这些方法称为特权方法(privileged method),它们是公有方法,为了能够在对象外部访问这些特权函数,它们的前面都要加上关键字this。其它任何不需要直接访问私有属性的方法都可以放在像Book.prototype中声明。

静态属性和方法

var Book = (function(){
// 私有静态属性
var numOfBook = 0;

// 构造函数
var cotr = function(argument){
// 私有属性
var name;

// 私有方法
function checkName(name){
// …
}

// 特权方法
this.getName = function(){
return name;
};

numOfBook++;
};

// 特权静态方法
cotr.getNumOfBook = function(){
return numOfBook;
};

// 返回构造函数
return cotr;

})();

// 公有静态方法
Book.display = function(){
// …
};

var book01 = new Book();
var book02 = new Book();
console.log(Book.getNumOfBook()); // 输出 2

在这里私有成员和特权成员仍然被声明在构造函数中,但原来的那个构造函数却从一个普通的函数变成了一个内嵌函数,并且被作为包含它的函数的返回值赋给变量Book。这就创建了一个闭包,可以把静态的私有成员声明在里面。位于外层函数声明之后的一对空括号很重要,其作用是代码一载入就立即执行这个函数。这个函数的返回值是另一个函数,它被赋给Book变量,Book因此成了一个构造函数。在实例化Book时,所调用的是这个内层函数,外层那个函数只是用于创建一个可以用来存放静态私有成员的闭包。

shejimoshi

http://julabs.com/blog/private-static-in-javascript-oop/

没有标签
首页      前端资源      JavaScript笔记      js面向对象的私用属性方法和对外接口

随身笔记

js面向对象的私用属性方法和对外接口
JavaScript面向对象编程中私有成员、静态成员的实现要比Java、ActionScript、Python要复杂的多,现在摘抄一些《JavaScript设计模式》中的代码来做演示。 私有属性和方法 var Book =…
扫描二维码继续阅读
2015-03-31