我试图围绕类,数据可见性和闭包(特别是
Javascript)的想法,我在jQuery文档页面上提供了类型,它提到关闭用于隐藏数据:
The pattern allows you to create objects with methods that operate on data that isn’t visible to the outside—the very basis of object-oriented programming.
例子:
function create() { var counter = 0; return { increment: function() { counter++; },print: function() { console.log(counter); } } } var c = create(); c.increment(); c.print(); // 1
通过使用关键字var声明变量计数器,它已经在函数/类定义内部进行局部作用域.据我所知,可以说,从外面无法开始.我从数据可见性的角度看错了.
第二,如上所述编写课程有以下优点:
function create() { var counter = 0; this.increment = function() { counter++; } this.print = function() { console.log(counter); } return this; } var c = create(); c.increment(); c.print(); // 1
据了解,这些或多或少在语义上是相同的 – 第一个是更多的“jQuery风格”.我只是想知道是否有优势或其他细微差别,我从第一个例子中不能完全理解.如果我是正确的,这两个例子都会创建闭包,因为他们正在访问在自己的范围之外声明的数据.
解决方法
首先,两个版本使用闭包都是正确的.
第一个版本是更清洁(在我看来),更流行的现代javascript.第一种风格的主要潜在缺点是,您无法有效地将对象分配给构造函数的原型,如果您正在创建大量相同的对象,这是有用的(而且更有效).
第二种风格,我其实从来没有见过生产Javascript.通常,您将使用new实例化create,而不是在create()函数中返回此值,如下所示:
function create() { var counter = 0; this.increment = function() { counter++; } this.print = function() { console.log(counter); } } var c = new create(); c.increment(); c.print(); // 1