//code 1:
var Dog = (function () {
var age = 0; return {
getAge: function () {
return age++;
}
};
}());console.log(Dog.getAge());
console.log(Dog.getAge());/***************************************/分界线
//code 2:
function Dog()
{
    var age = 0 ;    this.getAge = function()
    {
        return ++age;
    };
}var d = new Dog();
console.log(d.getAge());
console.log(d.getAge());请问这两种实现有什么区别,用起来差不多

解决方案 »

  1.   

    1, 返回自己定义的对象
    2,Dog的实例对象,可能还可以继承prototype什么的
      

  2.   

    ++i 和 i++ 的笔误应该不算是你要问的差别。其实差别在这里
    第一种相当于封装了一个计数器:i一直增长。
    第二种的i是对于每个对象是唯一的,你再来个dog2,输出依然是1,2;不能用作计数器之类需求。
    你的例子用age不太适合。
      

  3.   

    (1)简单来讲,这两种都是创建对象的方式。
    第一种叫做"工厂模式",是依靠函数执行来返回一个对象然后赋给变量。在你的代码中就是依靠一个匿名函数的执行来返回一个具有getAge方法的对象,然后把这个对象赋值给了变量Dog。
    第二种叫做"构造函数模式",这种模式可以理解为是js函数的一种特性。js中,函数可以作为构造函数以new func();的方式来创建对象,而且重点在于函数内可以依靠this关键字来指定生成对象的属性和方法。在你的代码中Dog就是构造函数,函数内部的this.getAge=...则指定了凡是new Dog()生成的对象都具有getAge这么一个方法。
    (2)如果是像你的代码这样,就只生成一个对象,从功能上来说两种方法确实区别不大。
    如果是生成多个对象对象的时候,区别就出来了,第一种方法每生成一个对象就需要执行一次匿名函数,而第二种方法只需要new一下即可;更重要的区别在于第一种方法生成的对象无法判别对象的类别,而第二种方法生成的对象都有一个共同的类Dog,这一点也反映了两种方法在思想的上区别,第一种只求对象的生成,而第二种则是面向对象,在编写较为复杂的js程序时显然第二种更合适和高效。
    (3)虽然第二种在编写复杂程序时相比而言更合适,实际操作中,一般都会采用更面向对象的方式即"原型模式"(构造函数+prototype)而不会单独使用构造函数。关于js面向对象编程,网上有很多好文章,楼主可以自行google一下。
      

  4.   

    工具模式 使用第一种 (整个应用只要这样一个对象就可以了)
    对象模式 使用第二种(这样的对象在整个应用中要new 若干次)实际就看你的业务逻辑了