javascript进阶之对象篇(3)函数与自定义”类“

转自:http://www.blogjava.net/zkjbeyond/archive/2006/04/17/41530.html


开始之前我先明确个问题。如下代码


< SCRIPT LANGUAGE  =   " JavaScript " >  
<!--  
Person.type 
=   "  person  "  ;
Person.writeType 
=  function ()   {
    document.writeln( 
this .type);
}
 
 
//  var Person = function(){} // 如果这样定义会报错,可以看看前面文章,函数的预编译。 
  function  Person()   {}  
Person.writeType();
alert( typeof (Person));
 
for  ( var  key  in  Person)   {
    alert(key);
}
 
 var  person 
=   new   Person();
//  --> 
</ SCRIPT >
在这里Person是个函数,但我们还可以定义它的属性(type)。而Person有Object实例的特性(for in、可以定义属性),但Person不是Object的实例。

见如下代码:

< SCRIPT LANGUAGE  =   " JavaScript " >  
<!--  
Object.prototype.toString 
=  function ()   return  'myToString'}  ;
 function  Person()  
{

}
 
 Person.prototype.toString 
=  function ()   return  'Person'}  ;

 var  o 
=   new   Person();
alert(o);
alert(Person)
Person.toString 
=  function ()   return  'Person toString'}  ;
alert(Person)
//  --> 
</ SCRIPT >  
 

我理解function返回的数据类型是和Object同等级的数据类型。它有Object实例(new Object())的一些特性,但它不是Object的实例,因为它没有继承Object.prototype.toString=function(){return 'myToString'};但我们Person.toString=function(){return 'Person toString'};改变了覆盖了方法。
在《javascript权威指南》中,作者用这个特性实现了“类方法、类变量”static方法,与java中不同,这些方法不能用new Person()来调用。

Object                   function             同等级 function可以定义属性,可以(for in)

new Object()        new function()    同等级 new function()继承了Object的prototype,                                                      也会继承 function的prototype

小例子。看了原型对象就很清楚了啊。 原型对象最好在代码最前面定义,很容易被覆盖啊!

< SCRIPT LANGUAGE  =   " JavaScript " >  
<!--  
  
var   Person  =   function   ()   {
     
this .name = 'Person的构造函数中属性name';
     
this .getName = function ()  {
          
return   this .name;
 }
 
  
// this.toString=function(){}  //你把注释去掉看看效果 
 }
 
Person.name 
=   "  Person  "  ;
Person.toString 
=   function  ()   return   this .name + '的类方法'}  ;  //  我可以用this啊 
 alert(Person.toString())  //  类方法 
  var   o  =   new   Person();
alert(o.getName()); 
//  构造函数中的方法 
 alert(o);  //  访问toString方法   先找  对象中 构造函数中   Person的prototype中       Object的prototype中 
  Object.prototype.toString  =   function  ()   return  'Object的prototype中的toString'}  ;
alert(o); 
//  Object的prototype中 
  Person.prototype.toString  =   function  ()   return  'Person的prototpe中的toString'}  ;
alert(o);
o.toString 
=   function  ()   return  '我覆盖了toString方法了啊'}  
alert(o);
alert('我不能访问前面的toString了。如果有super就好了!');
 
//  其实还是可以访问到被覆盖的原型的。那样太复杂了。 
//
 --> 
</ SCRIPT >  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值