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;”的存在,函数的定义调用一次而无论实例化多少个对象。

  • 相关阅读:
    zabbix_server调优
    zabbix图形刷新延迟解决
    ntp同步报错解决
    python3.5 字典遍历
    python3.5 append使用
    python3.5 元组
    pycharm修改代码后第一次运行不生效解决
    Intellij IDEA 使用Spring-boot-devTools无效解决办法
    TOP命令各个参数代表意义详解
    ps命令各个内容信息详解
  • 原文地址:https://www.cnblogs.com/pengcc/p/4097567.html
Copyright © 2011-2022 走看看