工厂功能链表问题

时间:2016-07-25 20:09:22

标签: javascript

我正在尝试使用工厂函数的方式来实现一个对象,并尝试使用链表示例,其中我初始化一个空链表然后尝试添加节点,在add方法中我设置头部如果它未设置,否则将节点添加到链中的最后一个节点。 问题是头部似乎永远不会被设置,任何想法为什么?

"use strict"

const niceLog = s =>  {
  console.log(JSON.stringify(s, null, 2))
}

function linkedList() {
  let head

  const node = data => {
    return {
      data,
      next: null
    }
  }

  const add = data => {
    if (!head) {
      head = node(data)
    } else {
      const end = node(data)
      let n = head
      while (n.next) n = n.next
      n.next = end
    }
  }

  const del = data => {
    let n = head

    if (n.data === data) head = head.next

    while (n.next) {
      if (n.next.data === data) {
        n.next = n.next.next
        return
      }
      n = n.next
    }
  }


  return {
    head,
    add,
    del
  }
}


const ll = linkedList()

ll.add('cheese')
ll.add('crackers')
ll.add('tea')
ll.add('coffee')

niceLog(ll) // {}

这是es6类语法中的等效代码,它确实有效,(我听说工厂函数更好,因为它们避免了新的问题,并且这些关键字没有正确设置,这就是为什么我试图使用工厂函数)

const niceLog = s =>  {
  console.log(JSON.stringify(s, null, 2))
}

class Node {
  constructor(data) {
    this.data = data
    this.next = null
  }
}

class LinkedList {
  constructor() {
    this.head = null
  }

  add(data){
    if (!this.head) {
      this.head = new Node(data)
    } else {
      const end = new Node(data)
      let n = this.head
      while (n.next) n = n.next
      n.next = end
    }
  }

  del(data) {
    let n = this.head

    if (n.data === data) this.head = this.head.next

    while (n.next) {
      if (n.next.data === data) {
        n.next = n.next.next
        return
      }
      n = n.next
    }
  }
}


const ll = new LinkedList()

ll.add('cheese')
ll.add('crackers')
ll.add('tea')
ll.add('coffee')

niceLog(ll) // output = 


"head": {
    "data": "cheese",
    "next": {
      "data": "crackers",
      "next": {
        "data": "tea",
        "next": {
          "data": "coffee",
          "next": null
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:2)

评论太长了。你似乎很困惑一个工厂的功能'是在JavaScript中。工厂函数表示您避免使用this关键字。这确实意味着您避免使用new关键字:

let myFactoryPrototype = {
  someMethod: function() {
    return this.foo;
  }
};

let myFactory = () => Object.create(myFactoryPrototype);
let myObject = myFactory(); // no 'new'

注意常规和箭头函数语法的混合。我使用过this并不重要的箭头函数,以及它常用的旧function。如果您想避免this然后不使用方法,请使用对数据类型进行操作的常规(可能是纯粹的)函数:

const addToLinkedList = (list, node) => {
  // code return a new list with the extra node goes here
};

但实际上,在JavaScript中避免使用this是很困难的,你真的在​​削减谷物。另一方面,避免使用new非常简单,只需使用Object.create或对象文字即可。