日期:2014-05-16  浏览次数:20493 次

felayman——javascript对象的创建
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8"/>
    <script type="text/javascript">
         // javascript的面向对象的编程思想
         //创建一个对象
        var person = new Object();
        //alert(person);//会弹出是object类型
        //我们该如何为该对象添加属性呢?
        //alert(person.length);//如果此时我们弹出它的长度属性的话,出现未定义
        //但是假设我们开始就有一个字符串呢?
        var str = new Object("hello,felayman");
        //alert(str.length);//这里会弹出14,因为在创建对象的同时,赋予了它对象类型
        //那么,我们该如何给我们为初始化的person添加属性呢?
        person.name = "felayman";
        person.age = 22;
        //这样我们就给person对象添加了两个属性
        //alert("姓名:"+person.name+",年龄:"+person.age);
        //既然是面向对象的思想,我们可以为对象添加属性,那么自然也可以为对象添加方法
        //person.getname();//如果出现在这里,遭了,程序会报错
        person.getname = function(){
            alert("姓名:"+person.name+",年龄:"+person.age+",测试成了?");
        }
        //我们试试看,能不能调用该方法呢?
        //person.getname();
        /*那么假如我们上面这句话放在getname方法的定义之前会出现什么情况呢?
        因此,上述的对象定义的方法就不好了,因为对象的属性和方法太分散了,那么
        有么有一个比较好的方法呢?当然有,那就是JSON格式(尽管有人给他叫字面量)
    */
        var user = {
            name:"felayman",
            age:22,
            job:"student",
            getAttr:function(){
                alert("姓名:"+this.name+",年龄:"+this.age+",职业:"+this.job);
            }
        };
        //这样我们就创建了一个对象的同时,并且为该对象添加了属性和方法,看,是不是跟java很象了
        //这样的风格清晰明朗,封装性极强,因此,在编写面向对象的javascript脚本时,这样刚刚无疑是租好的
        //我们测试一下
        //alert(user);//测试user的类型,我是测试成功了
        //user.getAttr();//我也测试成功了
        //我们测试一下对对象属性的修改,此时我们并没有涉及到数据的作用域
        user.name = "felay";
        //user.getAttr();//测试成功
        /*下面出现一个问题,我们该如何象java那样对对象的属性和方法,进行作用域设置呢
            java对属性和方法的保护是通过private,protected,public来空值的,那么
            javascript又是怎么进行的呢?下面我们将尝试这么做
        */
        //假如我们想对某对象的一个属性来进行只读属性的设置,怎么做呢?如下
        var obj = {};//创建一个对象
        Object.defineProperty(obj,"name",{
            writale:false,
            value:"felay_man"
        });
         //上述代码就创建一个具有name属性的对象obj,但是,这个name属性是只读的
        //alert(obj.name);//会弹出felay_man
        //那么我们测试一下对name属性进行修改
        obj.name = "hello";
        //alert(obj.name);//依然是弹出felay_man
        //假如我把上述的writable属性改为true呢?也许很多人觉得能够进行修改,可惜是不行的
        //当然我们也可以想java那样使用setter和getter进行属性的获取
        var book={
            //这里的属性前面带上的'_',其含义就是该属性可以通过getter进行属性的获取
            _version:1.8,
            _author:"felayman"
        };
        Object.defineProperty(book,"version",{
            get:function(){
                return this._version;
            },
            set:function(version){
                this._version = version;
            }
        });
        //上述代码就对book对象设置了两个就可以使用setter和getter进行属性的获取和修改了
        //alert(book._version);//这里依然能够获取的到
        //因此上述的方法相当麻烦,而且和我们普通的JSON格式创建的对象没有什么区别,这样做只是
        //增加规范而已,因此我们平时不建议这么写
    </script>
    <title>javascript面向对象编程</title>
</head>
<body>

</body>
</html>