是关于良好实践的javascript原型,关闭是一件好事

时间:2016-05-08 13:19:25

标签: javascript oop closures prototype

我正在尝试学习几周的javascript(node.js)。我对.NET有一些很好的了解,结果证明这是一件坏事。 我对javascript的理解一般是:

  • 一切都应该放在功能中,我们可以将它们视为 类,但不是那样称呼它们
  • 函数(方法)应该总是放在原型中,原型就像是我们“类”的每个实例的共享函数,就是 - 为所有这些实例设置一次
  • 闭包是一件好事,他们隐藏私人方法,他们似乎也在记忆中持续到未知的时刻,持有vars

这是为了让你了解我目前对JS的理解,但实际的问题如下:我有一些代码,希望在原型中有一个闭包,因此 - 写在我的弱未知中,接近于javascript的意图使用。所以,

  1. 是javascript原型,关闭是一件好事 好的做法,如果是的话,这个代码就是很好的例子吗?
  2. 为什么我想在myclass构造函数中“返回这个”?
  3. 和最终 - 代码no1和no2的一部分是一样的吗?
  4. function createFunctionWithClosure() { // number, and a gensym method that produces unique strings
        var prefix = '';
        var seq = 0;
        return {
          set_prefix(p) {
              prefix = String(p);
            },
            set_seq: function(s) {
              seq = s;
            },
            get_unique: function() {
              var result = prefix + seq;
              seq += 1;
              return result;
            }
        };
      }
    
    //example no1
    function myclass_t() {
      //why some examples have
      return this
    }
    myclass_t.prototype = createFunctionWithClosure();
    var myclass = new myclass_t()
    myclass.set_prefix('no1--->')
    myclass.set_seq(100)
    console.log(myclass.get_unique()) //100
    console.log(myclass.get_unique()) //101...
    
    //example no2
    var myvar = createFunctionWithClosure();
    myvar.set_prefix('no2-->')
    myvar.set_seq(1000);
    myvar.get_unique()
    myvar.get_unique()
    console.log(myvar.get_unique()) //1002
    console.log(myvar.get_unique()) //1003

    我确实试图谷歌很多,但有些信息(根据最近的一些评论判断)有点过时,可能不再有效,例如this question about perfomance of closures

2 个答案:

答案 0 :(得分:0)

#1是javascript原型,在良好实践方面是一个好东西,如果是的话,这个代码是很好的例子吗?

闭包是一个函数,其自身的作用域引用其他作用域的成员:

// "x" is being referenced on the inline function's scope
var x = "hello world";
var func = function() {
   console.log(x);
};

是否是一个好主意,它将取决于项目的要求......我会说,在那几个我会走这条路的情况。

#2为什么我想拥有"返回这个"在myclass构造函数中?

因为一些角落的情况。如果你正在开发fluent interface,你可能想要返回this,如果整个函数没有从声明它的对象中调用,你就会这样做。

例如:

var obj = {
    doStuff: function() {
       return this;
    }

    doStuff2: function() {
       return this;
    }
};

// This is a fluent interface
obj.doStuff().doStuff2();

构造函数中,返回this是没用的,除非你想将整个构造函数作为常规函数调用:

var func = function() {
    return this;
};

// The whole "return this" won't have any effect
// on this case
var instance = new func();

// With Function.prototype.call, the first parameter
// defines "this" within the scope of the called function.
// That is, it'll return the object with a text property...
var result = func.call({ text: "hello world" });
<3>#3和最终 - 是代码no1和no2的一部分相同的东西?

没有。

您的第一个示例显示了一个构造函数,其原型是factory function返回的对象。

另一方面,您的第二个示例使用整个工厂函数将其返回的对象设置为整个变量。

答案 1 :(得分:0)

这不是你问题的直接答案,但我认为你真正需要的是理解原型继承在javascript中的工作原理。

以下是good video and a live playgroundMozilla docs也是一个很好的信息来源。

一旦你理解了这些东西,你可能觉得这是一种“hackish”的做事方式,你是否需要接受这个或转移到ES6或一些像TypeScript这样的编译到javascript语言,请参阅{{3有关此内容的更多信息。