`
simohayha
  • 浏览: 1387621 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

pro js读书笔记1

阅读更多
1首先我们来看一下js中的public method:

// 创建一个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 );


简单的使用构造函数和prototype属性即可以构造出oo中的 public 方法。

2 紧接着我们来看private方法:
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();


3 再来看一下privileged方法,所谓privileged方法也就是可以存取private属性的方法。
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 );


这边要注意的是getYearBorn是一个动态创建的方法,也就是在运行时被加到对象的,而不是首次编译的时候。这种方法非常的power和flexible.我们可以紧接着看下面的例子:这个例子书里面的代码有错,我改了一下,可是改了之后并不能实现书中想实现的功能。
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 );

这边 user.getname会直接返回44,lich给我的解释是:
引用

ECMA 给出的函数优化方法对于命令式语言是有问题的,所有的 get[i] 函数因为代码同源,所以都是一个,set[i] 们也是一样。所以怎么变,都是返回一个上次 set[i] 后的值。换句话说,具有讽刺意味的是,properties[i] 都已经被固化为一个地址了,for 取的第一个地址。更令人沮丧的是,使用函数生成器也是没用的。目前还没想到什么好办法。

最后我们来看下静态方法:
User.cloneUser = function( user ) {
    //创建并返回一个User对象
    return new User(
        //这边可以说是克隆了一个user对象.
        user.getName(),
        user.getAge()
    );
};
分享到:
评论
3 楼 Lich_Ray 2007-09-01  
都是这样。。。绑定在某个对象上的也是这样。
2 楼 simohayha 2007-08-29  
引用
在构造函数中写什么都是“动态创建”的吧


意思也就是只有在调用getYearBorn方法时他才会被创建,没有调用到它,它是不会被创建的,比如getYearBorn有个错误,如果你不调用它,浏览器是不会提示你出错的。

呵呵,我的理解是这样的,不知道对不对.
1 楼 Lich_Ray 2007-08-29  
引用
这边要注意的是getYearBorn是一个动态创建的方法,也就是在运行时被加到对象的,而不是首次编译的时候。

是吗?在构造函数中写什么都是“动态创建”的吧,不太明白博主想表达什么意思。

相关推荐

Global site tag (gtag.js) - Google Analytics