当前位置: 首页 > 面试题库 >

新操作符如何在JavaScript中工作?

相高谊
2023-03-14
问题内容

可能是JavaScript中鲜为人知的部分,位于原型链旁边。

所以问题是:如何…

new dataObj(args);

…实际上是创建一个对象,并定义其原型链/构造函数/等?

最好是显示一个替代方案,以充分理解该关键字。


问题答案:

new操作者使用内部[[Construct]]方法,它基本上具有下列功能:

  • 初始化新的本机对象
  • 设置[[Prototype]]此对象的内部,指向Function prototype属性。
    • 如果函数的prototype属性不是对象(则使用原始值,例如Number,String,Boolean,Undefined或Null)Object.prototype
  • 创建对象后,它将调用该函数,并提供对象作为其this值。
  • 如果被调用函数的返回值是原始值,则返回内部创建的对象。
  • 否则,如果返回对象,则内部创建的对象将丢失。

new运算符的等效实现可以这样表示(假设ECMAScript 5 Object.create方法可用):

function NEW(f) {
  var obj, ret, proto;

  // Check if `f.prototype` is an object, not a primitive
  proto = Object(f.prototype) === f.prototype ? f.prototype : Object.prototype;

  // Create an object that inherits from `proto`
  obj = Object.create(proto);

  // Apply the function setting `obj` as the `this` value
  ret = f.apply(obj, Array.prototype.slice.call(arguments, 1));

  if (Object(ret) === ret) { // the result is an object?
    return ret;
  }
  return obj;
}

// Example usage:
function Foo (arg) {
  this.prop = arg;
}
Foo.prototype.inherited = 'baz';

var obj = NEW(Foo, 'bar');
obj.prop;          // 'bar'
obj.inherited;     // 'baz'
obj instanceof Foo // true


 类似资料:
  • 我不是100%清楚RxJs 5运算符是如何工作的,请参阅这里的最新文档。jsbin的问题在这里。 如果我创建一个由0到2组成的可观察序列,每个值间隔一秒钟: 如果我为这个可观察对象创建两个订户: 我在控制台中看到: 我原以为每个订阅都会订阅相同的可观察对象,但事实似乎并非如此!它就像订阅的行为创造了一个完全独立的可观察的! 但是如果运算符被添加到可观察的源: 然后我们得到: 如果没有,这就是我所期

  • 问题内容: 让我们来一个带有以下代码的file.js: 现在,我们有另一个JS文件,我们在其中执行以下操作: 在r1情况下,它按预期工作-r1包含对新创建对象的引用。 在r2情况下,它不起作用-r2从file.js中获取对module.exports的引用。 目的是通过调用func()构造函数来创建一个新对象。当然,我也可以用等于r1的方式来做: 但是,我不明白为什么r2的行为方式与r1不同。 围

  • 我有最新版本的VsCode,我正在按照教程创建一个基本的下一个。js应用程序 我注意到教程使用了JSX in。JS文件,我的编辑器没有抱怨JSX。 这怎么可能?VsCode默认情况下是否识别中的JSX。JS文件?下一步做什么。js自动编译JSX?

  • 问题内容: 在某些情况下,使用类型转换返回null值而不是抛出ClassCastException是可行的。C#让操作员执行此操作。Java中是否有等效的东西可用,因此您不必显式检查ClassCastException? 问题答案: 这是@Omar Kooheji建议的as的实现:

  • 问题内容: 我看到了一些代码,它们似乎使用了我不认识的运算符,它们以两个感叹号的形式出现,如下所示:。有人可以告诉我这个操作员做什么吗? 我看到的背景是 问题答案: 转换为。如果是falsey(例如,,等),这将是,否则,。 因此,不是运算符,只是运算符的两倍。 实际示例“测试IE版本”: 如果你⇒ 但是如果你⇒

  • 应用程序具有上下文路径-->/spring-form-simple-project 因此,为了访问,我使用: 这个控制器又返回student.jsp,当提交这个student.jsp时,它用-->@RequestMapping(value=“/AddStudent”,method=RequestMethod.post)调用controller 任何关于这通常如何工作的指示都将是有帮助的。 谢谢!