边城愚人

如果我不在边城,我一定是在前往边城的路上。

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  31 随笔 :: 0 文章 :: 96 评论 :: 0 Trackbacks
    最近在阅读《 JavaScript 高级程序设计》,未免遗忘读过的内容,就打算以博客的形式做些读书笔记。今天介绍的是 JavaScript 中的四种定义对象的方法,除了这四种方法,还有工厂方法来定义对象,但考虑到其简单性及非正规性,这里就不做介绍。和 Java 这样的面向对象语言相比, JavaScript 更像是函数式语言,其并没有类的概念,盖之以对象定义的概念,而具体创建的对象叫做对象的实例。
    1)构造函数方式定义对象。 这种方式是在构造函数内定义属性和方法。这里举个简单的例子:
   
function Animal(name){
        
this.name = name;
        
this.introduceSelf = function(){
            window.alert(
"I am a " + this.name+"!");
        };
}
    对象的实例化如下:
var dog = new Animal("dog");
dog. introduceSelf();
    当然,
也可以将对象的方法在构造函数外定义,如下所示:
function introduceSelf(){
    window.alert(
"I am a " + this.name+"!");
}
    
function Animal(name){
    
this.name = name;
    
this.introduceSelf = introduceSelf();
}
  
这种在构造函数内定义所有的属性和方法的方式,使得构造函数相当于 Java 中类的概念。而将方法的具体定义独立地放在构造函数外,会使得对象的定义和方法的定义并不紧密,如果在一个文件中这样的方法和对象定义多的话,就会看起来凌乱许多。

    2)
原型方式。 该方式利用对象的 prototype 属性,可以将其看成创建新对象所依赖的原型(关于
prototype 的详细信息,可以百度一下,这方面的资料还是很多的)。这种方式将构造函数做成空构造函数,然后将所有的属性和方法被直接赋予 prototype 属性,还是前面的例子,重写如下:
   
function Animal(){
    
}
Animal.prototype.name 
= "animal";
Animal.prototype.introduceSelf 
= function(){
    window.alert(
"I am a " + this.name+"!");
};
//对象的实例如下:
var dog = new Animal();
dog.name 
= "dog";
dog.introductSelf();
  
这种方式的缺点是显而易见的,就是不能在构造函数中对属性进行赋值操作。还有一点是,对于引用类型的属性(如 Array 实例),实例化的多个对象将共享一个引用。正因为这么多的问题,这种对象定义的方式并不可取。

    3)
构造函数、原型混合方式。 这种方式是最为流行的对象定义方式。它结合了构造函数及原型方式。这种方式用构造函数定义对象的所有非函数属性,用原型方式定义对象的函数属性(方法)。重写前面的例子:
function Animal(name){
    
this.name = name;
}
Animal.prototype.introduceSelf 
= function(){
    window.alert(
"I am a " + this.name+"!");
};
   
    4)
动态原型方式。 和构造函数、原型混合方式相比,动态原型方式只是在函数属性定义的位置上有所不同。重写前面的例子:

   
function  Animal(name){
    
this .name  =  name;
    
if ( typeof  Animal._initialized  ==  'undefined'){
        Animal.prototype.introduceSelf 
=   function (){
            window.alert(
" I am a  "   +   this .name + " ! " );
        };
        Animal._initialized 
=   true ;
    }
}
      其中_initializedAnimal的全局私有属性(JavaScript中没有私有属性的概念,所有的属性都是共有的,但为了表明一些属性的私有特性,人们习惯在属性名前加上“_”。),当第一次实例化Animal时,if条件就为真,这样就会定义Animal中的函数属性。由于“Animal._initialized = true;”的存在,函数的定义调用一次而无论实例化多少个对象。

posted on 2007-04-08 11:24 kafka0102 阅读(22073) 评论(8)  编辑  收藏 所属分类: Ajax

评论

# re: JavaScript中定义对象的四种方式 2007-04-08 14:42 zkj
this.introduceSelf = introduceSelf();

写错了吧  回复  更多评论
  

# re: JavaScript中定义对象的四种方式 2007-04-08 20:28 kafka0102
确实不对,我试了一下,name属性根本没有起作用,看来外部方法introduceSelf()需要添加参数name才行!  回复  更多评论
  

# re: JavaScript中定义对象的四种方式 2007-04-09 11:57 Toez
楼主的 this.introduceSelf = introduceSelf(); 是不是写错了?

这样的用意, 并不是把introduceSelf()的句柄传给 内部变量this.introduceSelf, 而是首先执行了introduceSelf()这个方法, 由于只是一个alert, 故此方法会返回一个underfined, 然后赋值给this.introduceSelf.  回复  更多评论
  

# re: JavaScript中定义对象的四种方式 2007-04-09 19:11 kafka0102
学艺不精,还需努力!  回复  更多评论
  

# re: JavaScript中定义对象的四种方式 2010-07-31 09:06 gaohongsheng
应该是this.introduceSelf = introduceSelf;
这样才对!  回复  更多评论
  

# re: JavaScript中定义对象的四种方式 2011-01-17 21:16 LuckyGeb
你这是类的构造,对象构造你只讲了一种,就是new,不要搞混  回复  更多评论
  

# re: JavaScript中定义对象的四种方式 2012-04-28 11:08 入门菜鸟
this.introduceSelf=introduceSelf();这句是没有问题的,只不过函数introduceSelf()这个函数里的this指的是window对象,而不再是Animal对象,所以alert("I am a " + this.name+"!");输出的内容实际上是"I am a !",也就是这里面的this.name的值是""。一点愚见,希望指正,Thanks.  回复  更多评论
  

# re: JavaScript中定义对象的四种方式 2013-01-20 12:18 翟进雄
感觉W3Cschool中ECMA中关于对象的介绍,还是比较全面的,可参考一下.  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: