1首先我们来看一下js中的public method:
[code]// 创建一个User的构造函数
function User( name, age ){
this.name = name;
this.age = age;
}
// 加一个新的函数getName到User的prototype.
User.prototype.getName = function(){
return this.name;
};
//加另一个函数getAge到 User的prototype.
User.prototype.getAge = function(){
return this.age;
};
//实例化User对象
var user = new User( "Bob", 44 );
// 测试代码
alert( user.getName() == "Bob" );
alert( user.getAge() == 44 );[/code]
简单的使用构造函数和prototype属性即可以构造出oo中的 public 方法。
2 紧接着我们来看private方法:
[code]function Classroom(students, teacher ) {
//将student和teacher设置为public属性.
this.students = students;
this.teacher = teacher;
//创建了一个私有的方法disp,展示出所有的学生的名字.
function disp() {
alert(students.join(", ") );
}
// 调用私有的方法
disp();
}
// 创建一个Classroom的对象
var b = new Classroom(["John", "Bob"], "Mr. Smith" );
//会提示出错,因为这里disp是一个私有的方法
b.disp();[/code]
3 再来看一下privileged方法,所谓privileged方法也就是可以存取private属性的方法。
[code]function User( name, age ) {
//这边years被设置为一个私有的属性.
var years = (new Date()).getFullYear()-age;
//创建了一个 Privileged方法来存取私有的years属性.
this.getYearBorn = function(){
return years;
};
}
// 创建了一个user对象
var user = new User( "Bob", 44 );
// 测试方法
alert( user.getYearBorn() == 1962 );
//这个将会显示true,这是由于years为私有方法.
alert( user.years == null );[/code]
这边要注意的是getYearBorn是一个动态创建的方法,也就是在运行时被加到对象的,而不是首次编译的时候。这种方法非常的power和flexible.我们可以紧接着看下面的例子:这个例子书里面的代码有错,我改了一下,可是改了之后并不能实现书中想实现的功能。
[code]function User( properties ) {
var temp=this;
for ( var i in properties ) { (function(){
temp[ "get" + i ] = function() {
return properties[i];
};
temp[ "set" + i ] = function(val) {
properties[i] = val;
};
})(); }
}
var user = new User({
name: "Bob",
age: 44
});
alert( user.name == null );
alert( user.getname() == "Bob" );
user.setage( 22 );
alert( user.getage() == 22 );[/code]
这边 user.getname会直接返回44,lich给我的解释是:
[quote]
ECMA 给出的函数优化方法对于命令式语言是有问题的,所有的 get[i] 函数因为代码同源,所以都是一个,set[i] 们也是一样。所以怎么变,都是返回一个上次 set[i] 后的值。换句话说,具有讽刺意味的是,properties[i] 都已经被固化为一个地址了,for 取的第一个地址。更令人沮丧的是,使用函数生成器也是没用的。目前还没想到什么好办法。[/quote]
最后我们来看下静态方法:
[code]
User.cloneUser = function( user ) {
//创建并返回一个User对象
return new User(
//这边可以说是克隆了一个user对象.
user.getName(),
user.getAge()
);
};[/code]
[code]// 创建一个User的构造函数
function User( name, age ){
this.name = name;
this.age = age;
}
// 加一个新的函数getName到User的prototype.
User.prototype.getName = function(){
return this.name;
};
//加另一个函数getAge到 User的prototype.
User.prototype.getAge = function(){
return this.age;
};
//实例化User对象
var user = new User( "Bob", 44 );
// 测试代码
alert( user.getName() == "Bob" );
alert( user.getAge() == 44 );[/code]
简单的使用构造函数和prototype属性即可以构造出oo中的 public 方法。
2 紧接着我们来看private方法:
[code]function Classroom(students, teacher ) {
//将student和teacher设置为public属性.
this.students = students;
this.teacher = teacher;
//创建了一个私有的方法disp,展示出所有的学生的名字.
function disp() {
alert(students.join(", ") );
}
// 调用私有的方法
disp();
}
// 创建一个Classroom的对象
var b = new Classroom(["John", "Bob"], "Mr. Smith" );
//会提示出错,因为这里disp是一个私有的方法
b.disp();[/code]
3 再来看一下privileged方法,所谓privileged方法也就是可以存取private属性的方法。
[code]function User( name, age ) {
//这边years被设置为一个私有的属性.
var years = (new Date()).getFullYear()-age;
//创建了一个 Privileged方法来存取私有的years属性.
this.getYearBorn = function(){
return years;
};
}
// 创建了一个user对象
var user = new User( "Bob", 44 );
// 测试方法
alert( user.getYearBorn() == 1962 );
//这个将会显示true,这是由于years为私有方法.
alert( user.years == null );[/code]
这边要注意的是getYearBorn是一个动态创建的方法,也就是在运行时被加到对象的,而不是首次编译的时候。这种方法非常的power和flexible.我们可以紧接着看下面的例子:这个例子书里面的代码有错,我改了一下,可是改了之后并不能实现书中想实现的功能。
[code]function User( properties ) {
var temp=this;
for ( var i in properties ) { (function(){
temp[ "get" + i ] = function() {
return properties[i];
};
temp[ "set" + i ] = function(val) {
properties[i] = val;
};
})(); }
}
var user = new User({
name: "Bob",
age: 44
});
alert( user.name == null );
alert( user.getname() == "Bob" );
user.setage( 22 );
alert( user.getage() == 22 );[/code]
这边 user.getname会直接返回44,lich给我的解释是:
[quote]
ECMA 给出的函数优化方法对于命令式语言是有问题的,所有的 get[i] 函数因为代码同源,所以都是一个,set[i] 们也是一样。所以怎么变,都是返回一个上次 set[i] 后的值。换句话说,具有讽刺意味的是,properties[i] 都已经被固化为一个地址了,for 取的第一个地址。更令人沮丧的是,使用函数生成器也是没用的。目前还没想到什么好办法。[/quote]
最后我们来看下静态方法:
[code]
User.cloneUser = function( user ) {
//创建并返回一个User对象
return new User(
//这边可以说是克隆了一个user对象.
user.getName(),
user.getAge()
);
};[/code]