2014-03-30 29 views
0

我一直在关注JS中的链表上的优秀guide。我遇到了一个带有'点'符号的函数,就好像它正在向函数中添加属性或方法一样。我不知道这是如何工作的这是代码片段。 (repl.it link使用自己的方法创建函数

function List(){ 
    List.makeNode = function(){ 
     return { 
      data: null, 
      next: null 
     }; 
    }; 
    this.start = null; 
    this.end = null; 

    this.add = function(data){ 
     if(this.start === null){ 
      this.start = List.makeNode(); 
      this.end = this.start; 
     } else { 
      this.end.next = List.makeNode(); 
      this.end = this.end.next; 
     } 
     this.end.data = data; 
    }; 
} 

var list=new List(); 

我的问题主要是对线路2:

List.makeNode = function(){} 

这里是文字描述这行代码是做这一行:

我们还需要一个简单的方法来创建一个节点,并且一种可能的方法是向 提供带有makeNode方法的构造函数List:如果这个 看起来很奇怪,那么记得一个函数也是一个o bject和可以 有方法和属性。这种方法类似于提供 类或静态方法和属性。

我理解构造函数的概念。在我最后一行代码中,调用构造函数List();使用new关键字导致VAR列表包含的对象:

{ start: null, 
    end: null, 
    add: [Function] 
} 

而且,如果我换成“List.makeNode”(在我的名单()构造函数的2线)与“this.makeNode ......”我的变种列表对象我创建将有makeNode功能列表对象的一个​​方法:

{ makeNode: [Function], 
    start: null, 
    end: null, 
    add: [Function] 
} 

我理解名单()是最终的目标,并最终从Object.prototype中继承一切。此List()对象/构造函数包含:

{ [Function: List] makeNode: [Function] } 

我真的不知道这是如何工作的。

  • MakeNode是List对象的属性/方法,它还包含 List Function?
  • 为什么我们必须保持makeNode与List关联?
  • 将列表更改为“this”并在每个List()的新实例上都有makeNode 函数是一件大事吗?

我很遗憾我们为什么要使用List.makeNode,它存储在哪里,以及它为什么以这种方式实现。

谢谢!

回答

3

可能是错误。

function List(){ 
    List.makeNode = function(){ }; 
    /* */ 
} 
List.makeNode; // undefined 
new List();  // This creates List.makeNode method 
List.makeNode; // function 
new List();  // This recreates List.makeNode method 

有在每一个实例被创建时(如果你想有机会获得最后创建的实例,这是不是这样的数据时除外)重新构造的方法是没有意义的。

如果makeNode真应了List方法,更好的方法是

function List(){ 
    /* */ 
} 
List.makeNode = function(){ }; 

或者,如果它应该是实例的特权方法,

function List(){ 
    this.makeNode = function(){ }; 
    /* */ 
} 

或者,如果它应该是公开方法实例,

function List(){ 
    /* */ 
} 
List.prototype.makeNode = function(){ }; 
3

MakeNode是List对象的属性/方法,它也包含List Function?

它只是List函数的一个属性。每个函数都是一个对象,因此您可以像对待其他每个对象一样将属性分配给函数。

但是把这个赋值放到构造函数中是奇怪的,这是不必要的。 “静态方法”应该只被分配给构造,一旦它被创造:

function List() { 
    // ... 
} 

List.makeNode = function() { 
    // ... 
}; 

为什么我们必须保持与列表关联makeNode?

你会做什么呢?您可以只定义一个独立函数,如function makeNode() { ... },但由于该函数仅用于创建列表,因此将其与List以某种方式关联是有意义的。

它是一个大问题,改变清单“这个”,并有makeNode功能上的“名单()”每一个新的实例?

这意味着,每代替List都有自己副本makeNode。由于函数本身并不依赖于任何特定于实例的属性,因此这样做是不必要的。

可以的方法分配给List.prototype代替,不过,它看起来并不像一个List实例需要访问该功能,所以没有理由把它放在那里。

+0

+1,尽管你可以强调一点的是“列表对象” * *是他提到的“列表函数” – Bergi

+0

个人而言,我只是将它作为List构造函数的本地函数。没有明显的理由让它在外部可见。使它成为构造函数的一个属性似乎是出于教学原因无偿地做的事情。我猜想的问题。 – Pointy

0

这两个答案其实都很好。

如果我可能有点添加到他们,一个简单的方法来创建类列表会是这样

var List = (function() { 
    function List() { /*Your Constructor*/ }; 
    List.prototype.add = function() { /*this is a method on each object*/ }; 
    List.makeNode = function() { /*Static method on Class List*/ }; 

})(); 

var myList = new List(); 
var myNode = List.makeNode(); 
/* Do something with the node */ 
myList.add(myNode); 
相关问题