Javascript 使用自己的方法创建函数

Javascript 使用自己的方法创建函数,javascript,Javascript,我一直在关注一个关于JS中的链接列表的优秀文章。我遇到一个带有“点”符号的函数,就好像它在向函数添加属性或方法一样。我不知道这是怎么回事,这里是代码片段。() 我的问题主要在第2行: List.makeNode = function(){} 下面是一行文字,描述这行代码的作用: 我们还需要一种简单的方法来创建节点,一种可能的方法是 为构造函数函数列表提供makeNode方法:如果 在您看来,函数也是一个对象并且可以 具有方法和属性。这种方法类似于提供 类或静态方法和属性 我理解构造函数的概念。

我一直在关注一个关于JS中的链接列表的优秀文章。我遇到一个带有“点”符号的函数,就好像它在向函数添加属性或方法一样。我不知道这是怎么回事,这里是代码片段。()

我的问题主要在第2行:

List.makeNode = function(){}
下面是一行文字,描述这行代码的作用:

我们还需要一种简单的方法来创建节点,一种可能的方法是 为构造函数函数列表提供makeNode方法:如果 在您看来,函数也是一个对象并且可以 具有方法和属性。这种方法类似于提供 类或静态方法和属性

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

{ start: null, 
  end: null, 
  add: [Function] 
}
此外,如果我将“List.makeNode”(在我的List()构造函数的第2行)替换为“this.makeNode…”,我正在创建的var List对象将具有makeNode函数作为List对象上的方法:

{ makeNode: [Function], 
  start: null, 
  end: null, 
  add: [Function] 
}
我知道List()最终是一个对象,并且最终继承了Object.prototype的所有内容。此List()对象/构造函数包含:

{ [Function: List] makeNode: [Function] }
我真的不知道这是怎么回事

  • makeNode是列表对象上的属性/方法,它也包含 列表功能
  • 为什么我们必须让makeNode与List关联
  • 将列表更改为“this”并拥有makeNode有什么大不了的吗 函数是否在“List()”的每个新实例上执行
我非常不明白为什么我们要使用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(){ };
或者,如果它应该是实例的公共方法

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

可能是个错误

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(){ };
或者,如果它应该是实例的公共方法

function List(){
    this.makeNode = function(){ };
    /* */
}
function List(){
    /* */
}
List.prototype.makeNode = function(){ };
makeNode是List对象上的一个属性/方法,它也包含List函数吗

它只是
列表
函数中的一个属性。每个函数都是一个对象,因此可以像处理其他对象一样为函数指定属性

但是,将赋值放在构造函数中是一种奇怪的、没有必要的操作。“静态方法”应在构造函数创建后分配给它:

function List () {
  // ...
}

List.makeNode = function() {
   // ...
};
为什么我们必须让makeNode与List关联

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

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

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

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

makeNode是List对象上的一个属性/方法,它也包含List函数吗

它只是
列表
函数中的一个属性。每个函数都是一个对象,因此可以像处理其他对象一样为函数指定属性

但是,将赋值放在构造函数中是一种奇怪的、没有必要的操作。“静态方法”应在构造函数创建后分配给它:

function List () {
  // ...
}

List.makeNode = function() {
   // ...
};
为什么我们必须让makeNode与List关联

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

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

这意味着,每个而不是
列表
都有自己的
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);

两个答案实际上都很好

如果我可以为它们添加一点,创建类列表的简单方法如下

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

+1,虽然你可以强调一点,“列表对象”是他个人所说的“列表函数”,但我只是将其作为列表构造函数的局部函数。没有明显的理由让它在外部可见。将其作为构造函数的一个属性似乎是出于教学原因而无偿做的事情。我猜是意见问题。+1,不过你可以再强调一点,“列表对象”就是他所说的“列表函数”