zoukankan      html  css  js  c++  java
  • JavaScript中定义对象的四种方式 2012-5-10 15:19 阅读(0)

    最近在阅读《 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 
    ;
    }
    }

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

  • 相关阅读:
    三个心态做人做学问 沧海
    成功走职场要找准自己的"快捷键" 沧海
    免费离线下载 拂晓风起
    Hibernate 获取某个表全部记录时 奇怪现象 (重复出现某个记录) 拂晓风起
    无法读取mdb 如果连接不了ACCESS mdb文件,就尝试安装MDAC 拂晓风起
    Netbeans 使用 Hibernate 逆向工程 生成hbm和pojo 拂晓风起
    如何点击单选框 radio 后面的文字,选中单选框 拂晓风起
    Java 连接access 使用access文件 不用配置 拂晓风起
    mysql下如何执行sql脚本 拂晓风起
    Hibernate配置access Hibernate 连接 access 拂晓风起
  • 原文地址:https://www.cnblogs.com/pengcc/p/4097567.html
Copyright © 2011-2022 走看看