浅谈JavaScript创建对象

  好久没写博客了,今天补一下,废话不多说,咱们进入正题。

  在java中,有这么一句话叫”万物接对象“,那么我今天就来说一下在JavaScript中怎么创建对象,当然要与其他语言作对比,作参照,才能更容易理解。

  对象由什么组成,方法与属性(行为)。

  在java中怎么创建对象,无非就是Object obj = new Object(),没错,JavaScript中也可以使用如此,细心的同学会发现,大多数语言在大多数方面有共通之处,

方法一、

   工厂模式:

      对于工厂模式,这个词大家都不陌生,陌生的话脑补一下”工厂“的车间的生产方式,没错,就是那样,举个栗子:

      function dog(name, age, voice){

        var obj = new Object();

        obj.name = name;

        obj.age = age;

        obj.voice = voice;

        obj.bark = function(){

          alert(this.voice);

        }

        return obj;

      }

      var dog_1 = dog("kugou", 12, " o o o ");

      dog_1.bark();   

      alert(dog_1.name); 

  这个dog函数可以被调用n次(n->),每次调用这个函数都会返回一个含有三个属性和一个方法的对象,但是无法用typeof和instance来判断出对象的类型,即对象无法识别,只能判断出dog_1是object,为此,另外一个模式出现了。

方法二、

   构造函数模式,在Java,C++中都有构造函数,而且还差不多,都是函数名跟类名相同,比如:

    Java中:

        public class dog{

          public dog(){

          }

        }

   C++也跟Java一样,在Java和C++中构造函数可以有多个,根据参数的不同而不同,扯远了,拐回来。

   在JavaScript中的原生对象都有原生的构造函数,如Object,Array等...。在运行时自动出现在执行环境中。我们也可以创建自定义的构造函数

    

      function dog(name, age, voice){

        this.name = name;

        this.age = age;

        this.voice = voice;

        this.bark = function(){

          alert(this.voice);

        }

      }

      var dog_1 = new dog("kugou", 12, " o o o ");

      dog_1.bark(); 

  在与上面的工厂模式相比,少了显示地创建Object对象,直接将属性和方法都赋给了this对象,而且没有return语句。在创建新的dog对象的时候,要用到new关键字,没错就是new,这跟JavaScript中自带的类的创建方式差不多了吧,new一个对象要经过一下步骤:

      ①创建一个新对象

      ②将构造函数的作用域给新对象,<!--this就指向了这个新对象-->

      ③构造函数中的代码,同时给这个对象添加属性

      ④返回新对象

  对象的constructor属性是用来标识对象的如

  alert(dog_1.constructor == dog)

  alert(dog_1 instanceof dog);

 

方法三、

    原型模式

      我们创建的每一个函数都有一个prototype属性,prototype是个对象,它的用途是包含可以由特定类型的所有实例共享所有的属性和方法。

      function dog(){

      }

      dog.prototype.name = "kugou";

      dog.prototype.age = 12;

      dog.prototype.voice = " o o o ";

      dog.prototype.bark = function(){

        alert(this.voice);

      }

      var dog_1 = new dog();

      dog_1.bark();

  所有prototype都会自动获得一个constructor属性,如:dog.prototype.constructor就是指向dog的,而我们的dog的构造函数是一个空函数,与构造函数不同的是新对象的这些属性和方法是由所有实例共享的,而构造函数就是独自拥有的。想理解原型模式,就得先理解ECMAScript中得原型的性质。

  先讲到这,脑休一下 0.0

posted @ 2015-10-24 18:03  风的味道  阅读(656)  评论(0编辑  收藏  举报