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

了解Object.create()和new SomeFunction()之间的区别

卫烨烁
2023-03-14
问题内容

最近,我偶然发现了Object.create()JavaScript中的方法,并试图推断该方法与使用创建对象的新实例有何不同new SomeFunction(),以及何时要使用一个实例。

考虑以下示例:

var test = {

  val: 1,

  func: function() {

    return this.val;

  }

};

var testA = Object.create(test);



testA.val = 2;

console.log(test.func()); // 1

console.log(testA.func()); // 2



console.log('other test');

var otherTest = function() {

  this.val = 1;

  this.func = function() {

    return this.val;

  };

};



var otherTestA = new otherTest();

var otherTestB = new otherTest();

otherTestB.val = 2;

console.log(otherTestA.val); // 1

console.log(otherTestB.val); // 2



console.log(otherTestA.func()); // 1

console.log(otherTestB.func()); // 2

请注意,在两种情况下都观察到相同的行为。在我看来,这两种情况之间的主要区别是:

  • Object.create()实际上,中使用的对象构成了新对象的原型,而在new Function()声明的属性/函数中,并没有形成原型。
  • 您不能Object.create()像使用函数语法那样使用语法创建闭包。给定JavaScript的词法(与块)类型范围,这是合乎逻辑的。

以上说法正确吗?我想念什么吗?您什么时候可以使用另一个?


问题答案:

Object.create中使用的对象实际上构成了新对象的原型,而与newFunction()一样,声明的属性/函数不构成原型。

是的,Object.create构建一个对象,该对象直接从作为其第一个参数传递的对象继承。

使用构造函数,新创建的对象将从构造函数的原型继承,例如:

var o = new SomeConstructor();

在上面的示例中,o直接继承自SomeConstructor.prototype

这里有一个区别,另一方面,Object.create您可以创建一个不继承任何对象的对象,Object.create(null);另一方面,如果您设置SomeConstructor.prototype = null;了新创建的对象将继承自的对象Object.prototype

您不能像使用功能语法那样使用Object.create语法创建闭包。给定JavaScript的词法(与块)类型范围,这是合乎逻辑的。

好了,您可以创建闭包,例如使用属性描述符参数:

var o = Object.create({inherited: 1}, {
  foo: {
    get: (function () { // a closure
      var closured = 'foo';
      return function () {
        return closured+'bar';
      };
    })()
  }
});

o.foo; // "foobar"

请注意,我在谈论的是ECMAScript 5th Edition Object.create方法,而不是Crockford的shim。



 类似资料:
  • 我读了很多关于和0之间的区别的文章来检查是否为空,并且发现比有性能,但是我很难理解为什么的性能好,即使里面isEmpty()只有size==0? 我的问题是: > 有没有人能简单地解释一下在哪种情况下速度更快,以及何时使用和函数来检查是否为? 有没有人可以用代码或其他方式(图表等)来解释这一点,让任何初学者都能很容易地理解?

  • 我正在寻找Java 8中的“新”流和之前Java 7中的“旧”I/O流之间的区别的一个很好的解释。对于没有任何函数式编程知识的人来说,很难理解它们是完全不同的东西,特别是因为它们的名称是相同的。我知道Stream API是一个全新的东西,在某些方面甚至是革命性的,但在我幼稚的想法中,在这两种情况下,我们都处理“事物”的序列,无论是字节、数据还是对象... 谁能给个很好的解释吗?

  • 问题内容: 这主要只是“检查我的理解”类型的问题。这是我对CLOB和BLOB在Oracle中工作的理解: CLOB用于XML,JSON等文本。您不应假定数据库将使用哪种编码(至少在应用程序中)存储该编码,因为它将被转换为配置为数据库使用的任何编码。 BLOB用于二进制数据。您可以合理地确定,它们将以您的发送方式存储,并且您将获得与发送时完全相同的数据。 因此,换句话说,我有一些二进制数据(在这种情

  • 问题内容: 我错放了太多次了,我想我一直忘记,因为我不知道两者之间的区别,只是一个给了我我期望的价值,而另一个却没有。 为什么是这样? 问题答案: 是的简写形式(尽管请注意,该表达式只会被计算一次。) 是的,即指定一元的到。 例子:

  • 问题内容: 因此,我有一段简单的代码可以打印出整数1-10: 然后,如果仅在第3行上更改一个运算符,它将打印出无限数量的1整数(我知道为什么会这样做)。为什么在运行第二个程序时没有出现语法错误?如果赋值运算符后面跟着一个加法运算符,它不会调用语法错误吗? 问题答案: 与相同, 只是意味着。