繁体   English   中英

用自己的方法创建函数

[英]Creating a Function with its own methods

我一直在遵循关于JS中链表的出色指南 我遇到了一个带有“点”符号的函数,好像它在向函数添加属性或方法一样。 我不知道这是如何工作的这是代码片段。 repl.it链接

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(){}

这是描述此代码行功能的文本行:

我们还需要一种简单的方法来创建节点,一种可能的方法是为构造函数提供List的makeNode方法:如果您觉得这很奇怪,请记住,函数也是对象并且可以具有方法和属性。 此方法类似于提供类或静态方法和属性。

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

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

此外,如果我将“ List.makeNode”(位于List()构造函数的第2行)替换为“ this.makeNode ...”,则我正在创建的var列表对象将具有makeNode函数作为列表对象上的方法:

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

我了解List()最终是一个对象,并最终继承了Object.prototype的所有内容。 该List()对象/构造函数包含:

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

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

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

我对我们为什么要使用List.makeNode,将其存储在何处以及为什么以这种方式实现它感到迷茫。

谢谢!

可能是个错误。

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(){ };

makeNode是列表对象(也包含列表函数)上的属性/方法吗?

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

但是将赋值放入构造函数很奇怪,这是不必要的。 创建后,应将“静态方法”分配给构造函数:

function List () {
  // ...
}

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

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

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

将List更改为“ this”并在“ List()”的每个新实例上都具有makeNode函数,这有什么大不了的吗?

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

可以将方法分配给List.prototype ,但是仍然看起来好像List实例不需要访问该函数,因此没有理由将其放置在那里。

这两个答案实际上都很好。

如果我可以向他们添加一点,创建类列表的简单方法就是这样

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM