Javascript 构造函数可以返回哪些值来避免返回此值?
当使用Javascript 构造函数可以返回哪些值来避免返回此值?,javascript,constructor,new-operator,Javascript,Constructor,New Operator,当使用new关键字调用构造函数时,Javascript中的return语句可以返回除this以外的值的确切情况是什么 例如: function Foo () { return something; } var foo = new Foo (); 如果我没有弄错,如果某物是非函数原语,将返回此。否则将返回某些内容。这是正确的吗 换句话说,something可以采用哪些值来导致(new Foo()instanceof Foo)===false?当您使用new关键字时,将创建一个对象。然后调用
new
关键字调用构造函数时,Javascript中的return
语句可以返回除this
以外的值的确切情况是什么
例如:
function Foo () {
return something;
}
var foo = new Foo ();
如果我没有弄错,如果某物
是非函数原语,将返回此
。否则将返回某些内容。这是正确的吗
换句话说,something
可以采用哪些值来导致(new Foo()instanceof Foo)===false
?当您使用new
关键字时,将创建一个对象。然后调用函数初始化对象
函数无法阻止对象的创建,就像在调用函数之前一样。我找不到有关此问题的任何文档,但我认为您是正确的。例如,您可以从构造函数返回新数字(5)
,但不能返回文本5
(该文本将被忽略,而此
将被返回)。确切条件在[[Construct]]
内部属性中描述,该属性由运算符使用:
从ECMA-262第三架。版本规格:
[[Construct]]
当函数对象F
的[[Construct]]]
属性
调用时,将采取以下步骤:
创建新的本机ECMAScript对象
将结果(1)
的属性设置为“对象”
获取F
的原型属性的值
如果Result(3)
是一个对象,请将Result(1)
的属性设置为Result(3)
如果Result(3)
不是对象,则将Result(1)
的属性设置为原始对象
原型对象,如下所示:
如中所述
调用F
的属性,提供结果(1)
作为此
值,并
提供传入[[Construct]]
的参数列表作为
参数值
如果(结果(6))
为
对象
然后返回结果(6)
返回结果(1)
查看步骤7和步骤8,仅当
结果类型(6)
(从F
构造函数返回的值
函数)不是对象。作为旁注,返回值或此
只是等式的一部分
例如,考虑这一点:
function Two() { return new Number(2); }
var two = new Two;
two + 2; // 4
two.valueOf = function() { return 3; }
two + 2; // 5
two.valueOf = function() { return '2'; }
two + 2; // '22'
如您所见,.valueOf()
是内部使用的,可以利用它来获取乐趣和利润。您甚至可以创建副作用,例如:
function AutoIncrementingNumber(start) {
var n = new Number, val = start || 0;
n.valueOf = function() { return val++; };
return n;
}
var auto = new AutoIncrementingNumber(42);
auto + 1; // 43
auto + 1; // 44
auto + 1; // 45
我可以想象这一定有某种实际应用。如果将.valueOf
添加到任何对象,则它也不必显式为数字,它可以作为数字:
({valueOf: function() { return Math.random(); }}) + 1; // 1.6451723610516638
例如,您可以利用此漏洞创建始终返回新GUID的对象。具体示例
试着用更简单的话讲几点
在javascript中,当对函数使用new
关键字时
函数不返回任何内容,它将返回预期的对象
函数用户(){
this.name='Virat'
}
var user=新用户();
console.log(user.name);//=>'Virat'
我不想谈这个。我知道你可以照我说的做(我已经试过了),但我不知道发生这种情况的确切案例。在我的例子中,有可能最终得到(foo instanceof foo)===false
?如果你不解释你认为错误的地方,它就不能改进答案。顺便说一下:这是因为新的数字(5)
(或者甚至只是Number(5)
,因为如果作为函数调用,它的工作原理是一样的)创建了一个数字对象,例如,这意味着当'==false
,!!新字符串(“”)=true
。两年后,我准备回复更正我自己的评论,这是有效的:函数一(){returnnewnumber(1)}
但这不是:函数一(){returnnumber(1)}
附加说明:typeof(null)是“object”,但是,返回null不会触发步骤7happen@BT:在我的node.js安装上测试时,上面引用的规范中似乎“Type(x)
是Object
”意味着“x实例的Object
是true
”,而不是“typeof(x)=='Object'
是true
”。例如,null instanceof Object
的计算结果为false(实际上,您不能从构造函数返回null
),而new String(“asdf”)instanceof Object
的计算结果为true(实际上您可以从构造函数返回字符串…)@JoSo我认为类型指的是对象的内部[[Class]]
属性。JavaScript中该值的最佳代理是Object.prototype.toString.call(x)
@JoSo:No。这意味着x
不是一个原语值,而是一个对象(包括数组、函数等)。它与typeof
或instanceof
@Martian2049无关,因为null
值的内部类型是,在内部,您可能认为这是“object”,因为typeof null==“object”
,但这不是内部类型操作检测到的。它将返回在步骤1中创建的对象,因为在内部,null
值内部类型为null,而不是object。相关:很好的示例!lll只需添加以下内容:新人({“stuff”:“stuff”})/{“stuff”:“stuff”}
/*
ECMA 262 v 5
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
"4.3.2
primitive value
member of one of the types Undefined, Null, Boolean, Number, Symbol, or String as defined in clause 6"
*/
var Person = function(x){
return x;
};
console.log(Person.constructor);
console.log(Person.prototype.constructor);
console.log(typeof(Person));
console.log(typeof(Person.prototype));
function log(x){
console.log(x instanceof Person);
console.log(typeof x);
console.log(typeof x.prototype);
}
log(new Person(undefined));
log(new Person(null));
log(new Person(true));
log(new Person(2));
log(new Person(""));
//returns a function not an object
log(new Person(function(){}));
//implementation?
//log(new Person(Symbol('%')));