在JavaScript中使用[apply]和[new]创建对象?

罗伊·纳米尔(Roi Namir)

我已经阅读有关使用applynew即时创建对象的重要问题

确切的问题是:

我想创建一个对象实例(通过new运算符),但是将任意数量的参数传递给构造函数。这可能吗

我对所选答案有疑问

/*1*/   function construct(constructor, args) {
/*2*/       function F() {
/*3*/           return constructor.apply(this, args);
/*4*/       }
/*5*/       F.prototype = constructor.prototype;
/*6*/       return new F();
/*7*/   }

工作jsbin

一切都好。

我试图将第3行移动到第6行:所以最终输出是:

/*1*/   function construct(constructor, args) {
/*2*/      // function F() {
/*3*/      //     return constructor.apply(this, args);
/*4*/      // }
/*5*/       //F.prototype = constructor.prototype;
/*6*/       return new constructor.apply(this, args);
/*7*/   }

工作jsbin

我的问题是为什么第二个示例不起作用?有什么不同 ?

我所做的就是将代码从一个地方移到另一个地方。

例:

function calc()
{
   function a() {return 4};

 return a(); // I could easily do `return 4` instead...;
}

问题

为什么移动的代码不起作用?

洛德维克Bogaards

您声明:

function construct(constructor, args) {
  function F() {
    return constructor.apply(this, args);
  }
  F.prototype = constructor.prototype;
  return new F();
}

应该与:

function construct(constructor, args) {
  return new constructor.apply(this, args);
}

但这实际上在几个基本方面有所不同:

1. constructor.apply是本机非构造函数。New只能从构造函数创建对象:

可以通过创建对象的构造函数来创建对象,然后通过为对象的属性分配初始值来执行初始化所有或部分对象的代码。每个构造函数都是一个函数,该函数具有名为“ prototype”的属性,该属性用于实现基于原型的继承和共享属性。通过在新表达式中使用构造函数来创建对象[...]

http://www.ecma-international.org/ecma-262/5.1/#sec-4.2.1

F另一方面是一个功能对象所有函数对象都可以用作构造函数。

注意:Alon Gubkin说new constructor.apply(this, args)不起作用,因为constructor.apply(this, args).prototype未定义。这不是真的。如果是因为那将意味着函数调用运算符的优先级比新运营商较高(即“新constructor.apply(这一点,参数)相同的新(constructor.apply(这一点,参数))`),这是不对

2.即使constructor.apply是构造函数,也不会与相同constructor.prototype的原型F设置为constructor's原型,以确保通过new运算符与组合创建的所有对象都与与组合创建的对象F相同constructor之间唯一的区别F,并constructor为他们不同的功能,从而可以用于F调用constructor以更灵活的方式。

constructor.apply.prototype可以实际设置为constructor.prototype,但constructor.apply仍不能使用构造函数。

3.在您的new constructor.apply(this, args)语句中,this参数不是指向新创建的对象,而是指向this本地范围。因此,即使您可以将apply函数用作将apply's原型设置为constructor's原型的构造函数,您仍然会将错误传递thisconstructor函数。

注意:在您的示例中

function calc()
{
   function a() {return 4};
   return a(); // I could easily do `return 4` instead...;
}

return可以与任何类型的表达式一起使用,而new不能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在PHP中使用`new ClassName`和`new ClassName()`创建对象之间的区别

来自分类Dev

在PHP中使用`new ClassName`和`new ClassName()`创建对象之间的区别

来自分类Dev

在Javascript中使用Factory创建对象

来自分类Dev

在 JavaScript 中使用 for 循环创建对象数组

来自分类Dev

为什么在服务中的函数中使用 let 和 new 创建新对象时会得到旧对象?

来自分类Dev

使用 new 和不使用 new 创建对象

来自分类Dev

使用函数和“ new”关键字在Javascript中创建对象的设计的意图是什么?

来自分类Dev

在JavaScript中使用“ this”使用方法创建对象

来自分类Dev

在数组中使用和对象分配JavaScript对象

来自分类Dev

在python中使用嵌套字典和列表创建json对象

来自分类Dev

如何在javascript中使用new关键字为一个对象赋予属性和方法?

来自分类Dev

如何在Javascript对象(类)中使用setter和getters?

来自分类Dev

如何在javascript中使用数组和对象

来自分类Dev

如何在JavaScript中使用小时和分钟创建数组?

来自分类Dev

Javascript 创建具有 new 和不具有 new + 继承的对象

来自分类Dev

在anthor对象中使用Object方法,而不在javascript中使用new关键字

来自分类Dev

使用变量的键和值创建javascript对象

来自分类Dev

使用 jQuery 和 javascript 从 HTML 创建对象数组

来自分类Dev

在 Java 中使用 new 关键字从类创建的引用变量和对象是一回事吗?

来自分类Dev

如果使用new运算符创建对象,为什么要在String中使用intern方法?

来自分类Dev

使用new Class()和new Class {}从类创建对象之间有什么区别?

来自分类Dev

如何在ScalaJS中使用new运算符创建新对象?

来自分类Dev

在R中使用match和apply

来自分类Dev

在JavaScript中使用对象数组

来自分类Dev

在JavaScript中使用带拼接功能的Apply

来自分类Dev

使用javascript创建json对象

来自分类Dev

使用 javascript 创建累积对象

来自分类Dev

如何在angularjs中使用ng-repeat和array时创建对象

来自分类Dev

如何在Swift中使用它创建类和实例对象的数组?

Related 相关文章

  1. 1

    在PHP中使用`new ClassName`和`new ClassName()`创建对象之间的区别

  2. 2

    在PHP中使用`new ClassName`和`new ClassName()`创建对象之间的区别

  3. 3

    在Javascript中使用Factory创建对象

  4. 4

    在 JavaScript 中使用 for 循环创建对象数组

  5. 5

    为什么在服务中的函数中使用 let 和 new 创建新对象时会得到旧对象?

  6. 6

    使用 new 和不使用 new 创建对象

  7. 7

    使用函数和“ new”关键字在Javascript中创建对象的设计的意图是什么?

  8. 8

    在JavaScript中使用“ this”使用方法创建对象

  9. 9

    在数组中使用和对象分配JavaScript对象

  10. 10

    在python中使用嵌套字典和列表创建json对象

  11. 11

    如何在javascript中使用new关键字为一个对象赋予属性和方法?

  12. 12

    如何在Javascript对象(类)中使用setter和getters?

  13. 13

    如何在javascript中使用数组和对象

  14. 14

    如何在JavaScript中使用小时和分钟创建数组?

  15. 15

    Javascript 创建具有 new 和不具有 new + 继承的对象

  16. 16

    在anthor对象中使用Object方法,而不在javascript中使用new关键字

  17. 17

    使用变量的键和值创建javascript对象

  18. 18

    使用 jQuery 和 javascript 从 HTML 创建对象数组

  19. 19

    在 Java 中使用 new 关键字从类创建的引用变量和对象是一回事吗?

  20. 20

    如果使用new运算符创建对象,为什么要在String中使用intern方法?

  21. 21

    使用new Class()和new Class {}从类创建对象之间有什么区别?

  22. 22

    如何在ScalaJS中使用new运算符创建新对象?

  23. 23

    在R中使用match和apply

  24. 24

    在JavaScript中使用对象数组

  25. 25

    在JavaScript中使用带拼接功能的Apply

  26. 26

    使用javascript创建json对象

  27. 27

    使用 javascript 创建累积对象

  28. 28

    如何在angularjs中使用ng-repeat和array时创建对象

  29. 29

    如何在Swift中使用它创建类和实例对象的数组?

热门标签

归档