从构造函数返回什么?

cou*_*011 20 javascript

如果我在构造函数中返回一些值或对象,var会得到什么?

function MyConstroctor()
{
    //what in case when return 5;
    //what in case when return someObject;
}

var n = new MyConstroctor();
Run Code Online (Sandbox Code Playgroud)

在这两种情况下会得到什么?

实际上它是一个测验问题,答案是什么?
从自定义对象构造函数返回什么?
a)新实例化的对象
b)未定义 - 构造函数不返回值
c)返回语句
是什么d)返回语句是什么; 如果没有return语句,则新实例化的对象

Tri*_*ych 65

简答

构造函数返回 this对象.

function Car() {
   this.num_wheels = 4;
}

// car = { num_wheels:4 };
var car = new Car();
Run Code Online (Sandbox Code Playgroud)

答案很长

通过Javascript规范,当调用函数时new,Javascript创建一个新对象,然后将该对象的"构造函数"属性设置为调用的函数,最后将该对象分配给该名称this.然后,您可以访问this该函数体的对象.

一旦执行了函数体,Javascript将返回:

如果函数手动返回一个对象,则为任何对象:

function Car(){
  this.num_wheels = 4;
  return { num_wheels:37 };
}

var car = new Car();
alert(car.num_wheels); // 37
Run Code Online (Sandbox Code Playgroud)

object函数没有this语句的对象,或者函数返回的类型不是return

function Car() {
  this.num_wheels = 4;
  return 'VROOM';
}

var car = new Car();
alert(car.num_wheels); // 4
alert(Car()); // No 'new', so the alert will show 'VROOM'
Run Code Online (Sandbox Code Playgroud)


CMS*_*CMS 40

基本上,如果你的构造函数返回一个原始值,比如string,number,boolean,null或undefined,(或者你不返回任何等同于返回的东西undefined),将返回一个从构造函数继承的新创建的对象prototype.

this当使用new关键字调用时,这是您在构造函数内使用关键字访问的对象.

例如:

function Test() {
  return 5; // returning a primitive
}

var obj = new Test();
obj == 5; // false
obj instanceof Test; // true, it inherits from Test.prototype
Test.prototype.isPrototypeOf(obj); // true
Run Code Online (Sandbox Code Playgroud)

但是如果返回的值是对象引用,那将是返回的值,例如:

function Test2() {
  this.foo = ""; // the object referred by `this` will be lost...
  return {foo: 'bar'};
}

var obj = new Test2();
obj.foo; // "bar"
Run Code Online (Sandbox Code Playgroud)

如果您对new运算符的内部感兴趣,可以检查[[Construct]]内部操作的算法,负责创建从构造函数的原型继承的新对象,并决定返回的内容:

13.2.2 [[Construct]]

当使用可能为空的参数列表调用对象的[[Construct]]内部方法时,将执行以下步骤:FunctionF

  1. 我们obj是一个新创建的原生ECMAScript的对象.
  2. 设置obj8.12中指定的所有内部方法.
  3. 设置to 的[[Class]]内部属性.obj"Object"
  4. 设置to 的[[Extensible]]内部属性.objtrue
  5. 让proto成为使用参数调用[[Get]]内部属性的值.F"prototype"
  6. 如果Type(proto)是Object , set the[[Prototype]]`obj到proto的内部属性.
  7. 如果Type(proto)不是Object,则将[[Prototype]]obj 的内部属性设置为标准内置Object原型对象,如15.2.4中所述.
  8. 让result成为调用[[Call]F 的] internal属性的结果,提供obj作为this值并提供[[Construct]]作为args 传递的参数列表.
  9. 如果Type(result)是Object则返回结果.
  10. 返回obj.

  • -1 jQuery不够---是我能想到的唯一原因. (6认同)
  • +1表示有效答案 - 除非有人能告诉我他们为何拒绝投票. (2认同)

Hai*_*vgi 20

我找到了这个很棒的链接:

JavaScript:构造函数返回值

上面提到的第二个魔法是构造函数返回特定的,可能是预先存在的对象的能力,而不是对新实例的引用.这将允许您在需要时自己管理实际实例的数量; 可能是因为资源有限或诸如此类的原因.

var g_deebee = new Deebee();
function Deebee() { return g_deebee; }
var db1 = new Deebee();
var db2 = new Deebee();
if (db1 != db2)
  throw Error("JS constructor returned wrong object!");
Run Code Online (Sandbox Code Playgroud)

  • 提供的链接已经死亡 (7认同)