javascript-如何让对象返回一个不是对象本身的值

javascript-如何让对象返回一个不是对象本身的值,javascript,javascript-objects,Javascript,Javascript Objects,创建x=new Date()对象时,如果将其放入console.log(x)中,将输出一个字符串 是否有一种方法可以创建一个自定义对象,该对象将返回一个不同的值,而该值不是对象本身您可以将大多数对象转换为字符串,如下所示 String(object) 像 同样地 x = Boolean(0); // wil return an object x = String(Boolean(0)); // will return a string 这是一个函数,但是如果您只执行console.log(新

创建
x=new Date()
对象时,如果将其放入
console.log(x)
中,将输出一个字符串


是否有一种方法可以创建一个自定义对象,该对象将返回一个不同的值,而该值不是对象本身

您可以将大多数对象转换为字符串,如下所示

String(object)

同样地

x = Boolean(0); // wil return an object
x = String(Boolean(0)); // will return a string

这是一个函数,但是如果您只执行
console.log(新测试)
操作,它仍然会输出对象。但是如果您强制它打印一个字符串,它将工作:
console.log(“%s”,新测试)

或者,如果将其与另一个字符串连接:

var a = new Test;
console.log('Result: ' + a);

> Result: Something else
我在代码中经常使用它来显示包含数据的对象内容的摘要

还有:


覆盖对象的字符串:

我上面的评论也提到了toString。您可以使用在对象的toString方法中动态打印出对象的所有属性:

function MyObject() {
  this.a = 'a';
  this.b = 'b';
  this.c = 'c';
}

MyObject.prototype.toString = function () {
  return JSON.stringify(this);
};

console.log((new MyObject()).toString()); // {"a":"a","b":"b","c":"c"}
// or
console.log('new MyObject(): ' + new MyObject()); // new MyObject(): {"a":"a","b":"b","c":"c"}
覆盖控制台。日志:

另一种尝试可能是覆盖console.log以始终打印字符串(仅在FF中测试!):


基本上有两个方法返回的值不是对象本身

每个对象都有一个
toString()
方法,当对象表示为文本值或以预期字符串的方式引用对象时,会自动调用该方法。默认情况下,从
对象
派生的每个对象都会继承toString()方法。如果未在自定义对象中重写此方法,`toString()返回“[object type]”,其中type是对象类型

JavaScript调用
valueOf
方法将对象转换为原语值。您很少需要自己调用
valueOf
方法;JavaScript在遇到需要原语值的对象时自动调用它

默认情况下,
valueOf
方法由其派生的每个对象继承。每个内置核心对象都会重写此方法以返回适当的值。如果对象没有基元值,
valueOf
返回对象本身

您可以在自己的代码中使用valueOf将内置对象转换为基本值。创建自定义对象时,可以重写
object.prototype.valueOf()
以调用自定义方法,而不是默认的
object
方法

为了解决您的问题,您可以将这两种方法实现为自定义函数

当两种方法都实现并返回原语值时,首先调用
valueOf
。如果
valueOf
返回一个对象,则调用
toString
方法

您可以看看这篇文章:

函数自定义(值){
这个值=值;
}
Custom.prototype.valueOf=函数(){
console.log('valueOf');
返回这个值*5;
};
var定制=新定制(7);
console.log(“”+自定义);//不要乱动
Custom.prototype.toString=函数(){
console.log('toString');
返回这个值*3;
};
Custom.prototype.valueOf=函数(){
console.log('valueOf');
返回{};
};

控制台日志(“”+自定义)new
关键字时,代码>不可用。根据定义,它将返回您调用的函数的实例。但是,您可以说类似于
x=new MyObj().init()
,并且您可以在对象上定义一个init函数,该函数返回对象本身以外的内容。在新对象中定义函数
toString()
。或者使用JSON.stringify,就像它甚至可以处理日期对象一样well@blauharley,mhodges我没有得到与问题相关的部分。@Jonasw我以为OP希望x等于某个不是对象本身的东西,当说
x=new Date()
时。平心而论,问题状态为“使自定义对象返回不同的值”,问题标题状态为“获取对象返回值”。调用
console.log()
时,对象没有返回值,
toString()
函数正在返回值。从技术上讲,我的评论回答了实际问题的措辞,但我可能误解了问题的意图。我看不到答案是否可以返回数组?是的,您可以在
toString
方法中返回数组。
var a = new Test;
console.log('Result: ' + a);

> Result: Something else
Test.prototype.valueOf =
  function () {
    return 42;
  }

console.log("%d", new Test);

> 3
function MyObject() {
  this.a = 'a';
  this.b = 'b';
  this.c = 'c';
}

MyObject.prototype.toString = function () {
  return JSON.stringify(this);
};

console.log((new MyObject()).toString()); // {"a":"a","b":"b","c":"c"}
// or
console.log('new MyObject(): ' + new MyObject()); // new MyObject(): {"a":"a","b":"b","c":"c"}
// initialize this only once so that console.log prints out correctly

(function () {
  var oldConsole = console.log;
  console.log = function (obj) {
    oldConsole(JSON.stringify(obj));
  };
}) ();

// now console.log prints strings
console.log({
  a: 'a'
}); // String: {"a":"a"}

console.log(new Date()); // String: "2017-01-19T19:09:49.673Z"

console.log(document); // String: {"location":{"href":"http://stackoverflow.com/questions/41748793/javascript-how-to-get-an-object-to-return-a-value-that-is-not-the-object-itsel/41749121#41749121","origin":"http://stackoverflow.com","protocol":"http:","host":"stackoverflow.com","hostname":"stackoverflow.com","port":"","pathname":"/questions/41748793/javascript-how-to-get-an-object-to-return-a-value-that-is-not-the-object-itsel/41749121","search":"","hash":"#41749121"},"jQuery112409140067213472354":3}