【问题标题】:Difference in objects created when created using different methods使用不同方法创建的对象的差异
【发布时间】:2017-11-26 19:54:56
【问题描述】:

我使用不同的方式创建了 2 个对象(object1 和 object2)。 我发现它们之间没有区别,除了它在 Chrome 开发控制台中的显示方式(见下面的截图)

var F;

function create(parent, properties) {
  F = function(p) {
    for(var i in p){
        this[i] = p[i].value;
    }
  };
  F.prototype = parent;
  return new F(properties);
}

var prop={ p: { value: 42 } };

var masterObject = {a: "masterObject value"}

var object1 = create(masterObject, prop);

var object2 = Object.create(masterObject, prop);

以下是我的问题:

  1. 由于我使用不同的方法来创建对象,对象 - object1 和 object2 之间会有什么区别吗?

  2. 从上面的截图(红圈)中可以看出有什么不同?

【问题讨论】:

  • 构造函数是不同的。 FObject
  • 当我检查两个对象的构造函数时,结果相同:function Object() { [native code] }
  • 哇,看起来你的代码给prototype.constructor造成了一些有趣的混乱......查看我的更新答案

标签: javascript oop object prototype


【解决方案1】:

两个对象具有相同的属性,并且继承自同一个对象。但是,有一点不同:

new F();
//vs.
Object.create(F.prototype);

构造函数(构建对象时调用的函数)应该是不同的:

object1.constructor!==object2.constructor

所以这些对象不应该相等,但是由于构造函数很少使用,所以没有真正的效果。

应该因为基本上

F.prototype=parent;

破坏了整个事情,因为 F.prototype.constructor 是用 F 初始化的,所以你要覆盖它。更多信息在 Why is it necessary to set the prototype constructor?

【讨论】:

  • 我认为你错过了一点,object2 是由masterObject 而不是F.prototype 创建的。因此,当我执行object1.constructor!==object2.constructor 时,它会返回false
  • @TempO'rary no. console.log(F.prototype===masterObj)
【解决方案2】:

当您将函数分配给变量时,您创建了一个命名函数。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name

它们在功能上是相同的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 2013-06-17
    • 2018-02-21
    • 1970-01-01
    • 2019-06-28
    相关资源
    最近更新 更多