使用自己的方法创建函数

时间:2014-03-30 19:40:36

标签: javascript

我一直关注JS中链接列表的优秀guide。我遇到了一个带有'dot'表示法的函数,好像它正在为函数添加一个属性或方法。我不知道这是如何工作的这里是代码片段。 (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:如果是这样   你回忆起一个函数也是一个对象而且可以   有方法和属性。这种方法类似于提供   类或静态方法和属性。

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

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

此外,如果我用'this.makeNode ...'替换'List.makeNode'(我的List()构造函数的第2行)'我创建的var list对象将makeNode函数作为方法列表对象:

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

我理解List()最终是一个Object,最终继承了Object.prototype中的所有东西。这个List()对象/构造函数包含:

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

我真的不知道这是怎么回事。

  • makeNode是List Object上的属性/方法,它也包含 列表功能?
  • 为什么我们必须将makeNode与List相关联?
  • 将List更改为'this'并拥有makeNode是一件大事 在'List()'的每个新实例上运行?

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

谢谢!

3 个答案:

答案 0 :(得分: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(){ };

答案 1 :(得分:3)

  

makeNode是List对象上的属性/方法,它还包含List函数吗?

它只是List功能的属性。每个函数都是一个对象,因此您可以像处理所有其他对象一样为函数指定属性。

但是将赋值放在构造函数中是奇怪的,这是不必要的。 "静态方法"应该只在创建后分配给构造函数:

function List () {
  // ...
}

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

为什么我们必须将makeNode与List相关联?

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

  

将List改为'这个'是一件大事吗?并在' List()'?

的每个新实例上都有makeNode函数

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

可以将方法分配给List.prototype,但是,它看起来不像List实例需要访问该功能,所以有没理由把它放在那里。

答案 2 :(得分: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);