我写道:
function myObj() {
return 7;
}
console.log(new myObj());
它返回:
myObj {}
为什么会这样?
如何让new myObj()
返回给我:7
?
我对new myObj()
的规范感兴趣而没有调用其他属性?
此任务:
new myObj() // return 1;
new myObj() // return 2;
new myObj() + new myObj() = // return 7;
答案 0 :(得分:3)
new myObj
创建并返回一个新对象,即使您的函数中有return 7
。 new
运算符专门用于创建对象,并且具有完全忽略构造函数的返回值的有趣行为,除非它是非null
对象引用;相反,new
返回它创建的对象。 (如果执行从构造函数返回非null
对象引用,它将覆盖new
的默认行为;用例很少见。)
如果您只想调用该函数并获取其返回值,请不要使用new
:
console.log(myObj());
如果要创建一个包含属性的对象,并将该属性设置为7
,然后打印它,则需要创建属性:
function myObj() {
this.thePropertyName = 7;
}
...然后使用它:
var o = new myObj();
console.log(o.thePropertyName);
...或:
console.log(new myObj().thePropertyName);
...但是你没有充分的理由创造和释放一个物体。
重新编辑,会更改 显着 的问题:
这个任务:
new myObj() // return 1; new myObj() // return 2; new myObj() + new myObj() = // return 7;
这是一个奇怪的要求。它像这样崩溃:
每次拨打new myObj
时,请保存一个号码(以1
开头)。
在对象上使用+
运算符时,请返回该数字。
可以执行此操作,方法是使用公共计数器,实例上的值,并覆盖toString
和valueOf
的默认实现;请参阅代码中的注释:
(function() {
"use strict";
// Use a scoping function to build `myObj` so that we
// keep the counter private
var myObj = (function() {
// The counter
var counter = 0;
// The `myObj` function we'll return
function myObj() {
// Increment the counter, remember the number
this.value = ++counter;
}
// When a coercion to number is preferred, JavaScript will
// use the valueOf function
myObj.prototype.valueOf = function() {
return this.value;
};
// When a coercion to string is preferred, JavaScript will
// use the toString function
myObj.prototype.toString = function() {
return String(this.value);
};
// Return `myObj` from our scoping function to export it
return myObj;
})();
// Using it
display(new myObj()); // "1"
display(new myObj()); // "2"
display(new myObj() + new myObj()); // 7
// Utility function
function display(msg) {
var p = document.createElement("p");
p.innerHTML = String(msg);
document.body.appendChild(p);
}
})();

答案 1 :(得分:0)
在javascript中,函数也是一个类。调用像myObj()这样的函数将返回值7。 但是使用new调用会克服该对象的实例并返回该对象,因此不会返回7。