function Node(val, type, parent) {
  if (typeof type !== 'string') {
    parent = type;
    type = null;
  }

  define(this, 'parent', parent);
  define(this, 'isNode', true);
  define(this, 'expect', null);

  if (typeof type !== 'string' && isObject(val)) {
    lazyKeys();
    var keys = Object.keys(val);
    for (var i = 0; i < keys.length; i++) {
      var key = keys[i];
      if (ownNames.indexOf(key) === -1) {
        this[key] = val[key];
      }
    }
  } else {
    this.type = type;
    this.val = val;
  }
}
function Node(val, type, parent) {
  if (typeof type !== 'string') {
    parent = type;
    type = null;
  }

  define(this, 'parent', parent);
  define(this, 'isNode', true);
  define(this, 'expect', null);

  if (typeof type !== 'string' && isObject(val)) {
    lazyKeys();
    var keys = Object.keys(val);
    for (var i = 0; i < keys.length; i++) {
      var key = keys[i];
      if (ownNames.indexOf(key) === -1) {
        this[key] = val[key];
      }
    }
  } else {
    this.type = type;
    this.val = val;
  }
}
function Node ( val , type , parent ) { if ( typeof type !== 'string' ) { parent = type ; type = null ; } define ( this , 'parent' , parent ) ; define ( this , 'isNode' , true ) ; define ( this , 'expect' , null ) ; if ( typeof type !== 'string' && isObject ( val ) ) { lazyKeys ( ) ; var keys = Object . keys ( val ) ; for ( var i = 0 ; i < keys . length ; i ++ ) { var key = keys [ i ] ; if ( ownNames . indexOf ( key ) === - 1 ) { this [ key ] = val [ key ] ; } } } else { this . type = type ; this . val = val ; } }
Create a new AST `Node` with the given `val` and `type`.

```js
var node = new Node('*', 'Star');
var node = new Node({type: 'star', val: '*'});
```
@name Node
@param {String|Object} `val` Pass a matched substring, or an object to merge onto the node.
@param {String} `type` The node type to use when `val` is a string.
@return {Object} node instance
@api public
Create a new AST Node with the given val and type .