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>