Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 构造函数可以返回哪些值来避免返回此值?_Javascript_Constructor_New Operator - Fatal编程技术网

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('%')));