Js 对象 实例 以及构造函数的练习

myObj.js:

/*function f1(){//Code}

var f1=function(){//Code}

var myFunction=new Function('f1','code')*/
//以上三种创建函数的方法相同

    var myObj=new Object();
    //ar myObj={};  //等于上行代码  实例化的myObj不能再通过new来建新的实例
    myObj.name='sidihu';//对象实例myObj添加静态属性
    myObj.age='26';
    //对象实例myObj添加静态方法
    myObj.showName=function(){
            alert(this.name);
    }
    
    myObj.showAge=function(){
            alert(this.age);
    }
    
    myObj.showSomething=function(){
            alert('showSonething');
    }
    
    //function  
    var myFun1=function(message){
        alert(message);
        this.message=message;
        
    }
    
    var myFun=function(){};
    //myFun既是一个实例 也是一个构造函数
    //直接用对象加点添加给对象的属性或者方法  本对象可以直接使用  但是myFun新的实例无法使用
    // 但是使用了prototype添加公有的属性或者方法myFun无法使用 但是myFun的新实例能够使用 y因为向prototype中添加的成员会把新方法添加到myFun的底层定义中  而不是添加到myFun实例自身
    //使用了prototype新建的方法中有不是用prototype创建的属性或者方法 myFun的新实例访问也会出错 例如myFun的新实例使用showAge()  因为showAge()中的age是不对外开放的
    myFun.name='sidihu';
    myFun.age='26';
    
    myFun.showName=function(){
            alert(this.name);
    }
    
    myFun.prototype.showAge=function(){
            alert(this.age);
    }
    
    myFun.prototype.showSomething=function(){
            alert('showSonething');
    }
    
    
    
    //私有变量
    var myPrivate=function(message){
        this.message=message;
        //私有属性和私有方法是存在于构造函数作用域中的自包含的对象 新实例无法访问
        //私有属性
        var separate="-";
        var myOwner=this;
        //私有方法
        function alertMessage(){
            alert("message is "+separate+myOwner.message);
            }
            
            //实例化时执行
            //alertMessage();
            
        //特权方法(也是公有方法)
        //getPrivate可以访问构造函数中的私有属性 并且
        this.getPrivate=function(){
                alert("getPrivate:message is "+separate+myOwner.message);
            }
    }
        
        //新实例可以使用
        myPrivate.prototype.showMessage=function(){
            alert(this.message);
        }
        
        myPrivate.prototype.showSeparate=function(){
            alert(this.showSeparate);
        }
        

页面js:

<script language="javascript" src="js/MyObject.js" type="text/javascript" ></script>
<script language="javascript" type="text/javascript" >

    window.onload=function(){
        //myObj.name='ok'; //重新修改name属性
        //myObj.showName();//直接使用myObj对象操作自己的属性和方法
        
        //将myObj对象赋值给myObj2后使用myObj2
        /*var myObj2= myObj;
        myObj2.showName=function(){ alert('i from myobj2 '+this.name);}//myObj2修改了myObj的showName方法
        myObj2.showAge();//26  
        myObj.age='30';
        alert(myObj2.age)//修改age属性的之后显示30
        alert(myObj.age)//30 myObj2修改了myObj的age属性
        myObj2.showName();//显示 i from myobj2 sidihu*/
        
        //var fromMyFun1=new myFun1("i am fun1");//myFun1被实例化后 myFun1中方法会直接执行 而且此时myFun1中的this指向fromMyFun1, fromMyFun1有了meaage属性
        //alert(fromMyFun1.message);
        
        /*//直接使用myFun
        myFun.showName();
        //myFun.showAge();//报错  因为showAge是使用了prototype添加的方法
        
        var fromFun=new myFun();
        fromFun.showAge();//不报错 因为fromMyfun是myFun的新实例*/
        
        var fromPrivate=new myPrivate('message');
        fromPrivate.showMessage();//不报错 
        fromPrivate.getPrivate();
        
        
    }

</script>

 

posted @ 2012-05-08 21:40  sidihu  阅读(773)  评论(0编辑  收藏  举报