【问题标题】:What's the difference between these two function declarations in Javascript?Javascript中这两个函数声明有什么区别?
【发布时间】:2017-08-13 16:48:49
【问题描述】:

我对这两个javascript案例有些怀疑:

function some() {
    this.some2 = function() {//this is associated with own object(Correct?)
        console.log('some2');
    }
}

var __s1 = new some();
__s1.some2();//Allright, this do the work;
//some().some2();//This not work

此声明类型有技术名称吗?也许是对象模式?

另一个类似的情况是这样的:

function some() {
    return {
        some2: function() {
            console.log('some2');
        }
    }
}

var __s2 = new some();
__s2.some2(); // Right, this work;
some().some2(); //Also work ... Ok, "some()" returns a object that contain
                //the some2().

这第二种情况,也有技术名称?

他们之间最好的情况是什么?

【问题讨论】:

标签: javascript design-patterns factory-pattern


【解决方案1】:

第一个是使用原型。调用new some() 创建一个新对象,在函数执行期间将this 设置为该对象,并返回新对象。在这种情况下调用some() 是没有意义的,因为在执行some 时不会设置任何this(尽管该函数仍然会执行。)

第二种情况是一个返回对象的普通函数。它没有技术名称。

类似于第二种情况,称为闭包。你可以这样做,

function some() {
    return function() {
        console.log('some2');

    }

然后做

var s3= some();
s3() //prints some2

【讨论】:

    【解决方案2】:

    在您的第一个 sn-p 中,您将一个函数与一个名为 some2 的属性相关联。

    在 JS 中,函数是第一类对象,因此它们可以具有附加属性,当您调用 some2 时,实际上是在 some 函数上使用对象委托。

    在您的第二个 sn-p 中,您使用 return 在每次调用时返回一个新的完全对象,该对象具有一个新函数 some2。当您启动一个基于 (new some()) 的新对象时,您实际上会返回具有新功能的新对象,而不是像在第一个 sn-p 中那样引用单个对象。

    【讨论】:

      猜你喜欢
      • 2012-04-01
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 2016-05-08
      相关资源
      最近更新 更多