代码之家  ›  专栏  ›  技术社区  ›  Thomas Eding

构造函数可以返回哪些值来避免返回这些值?

  •  87
  • Thomas Eding  · 技术社区  · 15 年前

    javascript中的return语句返回值的具体情况是什么? this 当使用 new 关键字?

    例子:

    function Foo () {
      return something;
    }
    
    var foo = new Foo ();
    

    如果我没弄错,如果 something 是一个非函数原语, 将被退回。否则 某物 被退回。这是对的吗?

    听着,什么价值观可以 某物 因果报应 (new Foo () instanceof Foo) === false ?

    6 回复  |  直到 6 年前
        1
  •  154
  •   Rubens Mariuzzo Salakar    8 年前

    确切的条件在 [[Construct]] 内部属性,由 new 操作员:

    摘自ECMA-262第3版规范:

    13.2.2 [[构造]]

    [[构造]] A的属性 Function 对象 F 是 调用时,将采取以下步骤:

    1. 创建一个新的本地ecmascript对象。
    2. 设置 [[Class]] 性质 Result(1) "Object" .
    3. 获取的原型属性的值 f .
    4. 如果 Result(3) 是一个对象,设置 [[Prototype]] 性质 结果(1) 结果(3) .
    5. 如果 结果(3) 不是对象,设置 原型 性质 结果(1) 原汁原味 Object 原型对象为 描述在 15.2.3.1 .
    6. 调用 [[Call]] 性质 F 提供 结果(1) 作为 this 价值与 提供传入的参数列表 [[构造]] 作为 参数值。
    7. 如果 Type (Result(6)) 对象 然后返回 Result(6) .
    8. 返回 结果(1) .

    看看步骤7和8,只有在 类型 结果(6) (从 F 构造函数 功能是 物体。

        2
  •  3
  •   philn5d    9 年前

    具体实例 http://jsbin.com/zivivucahi/1/edit?html,js,console,output

    /*
    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('%')));
    
        3
  •  2
  •   mkrause    15 年前

    我找不到关于这件事的任何文件,但我认为你是对的。例如,您可以返回 new Number(5) 来自构造函数,但不是文本 5 (被忽视 this 而是返回)。

        4
  •  0
  •   Camilo Martin    10 年前

    作为旁注,返回值或 this 只是方程的一部分。

    例如,考虑一下:

    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
    

    我能想象这一定是 一些 有点实际应用。它不必是明确的 Number 或者,如果你加上 .valueOf 对于任何对象,它都可以表现为一个数字:

    ({valueOf: function() { return Math.random(); }}) + 1; // 1.6451723610516638
    

    例如,可以利用此漏洞生成始终返回新guid的对象。

        5
  •  0
  •   Eric Aya    6 年前

    试着用简单的词来表达几点。

    在javascript中,当您使用 new 函数的关键字,如果,

    1. 函数不返回任何内容,它将返回预期的对象

    function User() {
      this.name = 'Virat'
    }
    
    var user = new User();
    console.log(user.name); //=> 'Virat'
    1. 函数返回任意 诚实的 复杂对象[对象、数组、函数等],复杂对象优先 user 变量将保存返回的复杂对象

    function User() {
      this.name = 'Virat';
      return function(){};
    }
    
    var user = new User();
    console.log(user.name); //=> undefined
    console.log(user); //=> function
    1. 函数返回任何文本,构造函数优先,它将返回预期的对象

    function User() {
      this.name = 'Virat';
      return 10;
    }
    
    var user = new User();
    console.log(user.name); //=> 'Virat'
        6
  •  -1
  •   Guffa    15 年前

    当您使用 new 关键字,则创建一个对象。然后调用函数初始化对象。

    函数不能做任何事来阻止创建对象,因为这是在调用函数之前完成的。