console.log() 对象不记录通过原型在节点 js 控制台中添加的方法。或者如何打印原型?

console.log() an object does not log the method added via prototype in node js console. Or how to print the prototypes also?

function Person(name)  {
        this.name = name;
    }

    Person.prototype.getName = function() {
        return this.name
    }

    var tinu = new Person('Tinu');

    console.log(tinu.getName()) //Prints the name 'Tinu' - Expected, means the function is added to protoype

    console.log(tinu);

最后的console.log()不通过点原型打印新添加的名为'getName'的方法,只打印属性'name',这里我希望在 Person 对象中同时打印 属性 'name' 和方法 'getName' 。以下是上述代码的实际输出和期望输出:

实际产量

蒂努
人物{姓名:'Tinu'}

期望输出

蒂努
Person { name: 'Tinu', getName: [Function] }

下图显示了另一个示例,其中通过原型添加的方法 'getFullName' 在打印时正确显示以控制添加它的对象。并期待与我的示例相同

在 chrome 开发工具中,如果您单击展开图标,您可以在 __proto__ 中看到原型属性:

你可以看到那里定义了getName()。这是放置它的合适位置,因为它是原型的 属性,而不是 person 对象本身。

console.log 是由您的 js 环境提供的 API(在您的情况下为 Node.js)。没有标准规格。所以在你的情况下 console.log 打印你的 Javascript-object.

的简单字符串表示
{ propName: propValue }

Node.js 中有一个实用程序模块 (util-documentation)。此外,我找到了一种方法,它 returns 对象的所有属性,包括原型链的所有属性。

const util = require('util')

function Person(name)  {
    this.name = name;
}

Person.prototype.getName = function() {
    return this.name
}

var tinu = new Person('Tinu');

console.log(util.inspect(tinu, {showHidden: false, depth: null}))

function getAllPropertyNames(obj) {
  var props = [];

  do {
    Object.getOwnPropertyNames(obj).forEach(function (prop) {
      if (props.indexOf(prop) === -1 ) {
        props.push( prop );
      }
    });
  } while (obj = Object.getPrototypeOf(obj));

  return props;
}

console.log(getAllPropertyNames(tinu)); 
/*
[ 'name',
  'constructor',
  'getName',
  '__defineGetter__',
  '__defineSetter__',
  'hasOwnProperty',
  '__lookupGetter__',
  '__lookupSetter__',
  'isPrototypeOf',
  'propertyIsEnumerable',
  'toString',
  'valueOf',
  '__proto__',
  'toLocaleString' ]
 */

如果您使用的是 浏览器 并希望查看已定义的方法和其他信息,您可以使用浏览器的开发人员工具。按F12,你可以做很多调查。