【问题标题】:What is the difference between object assignment '=' and Object.create()对象赋值 '=' 和 Object.create() 有什么区别
【发布时间】:2020-10-04 06:21:39
【问题描述】:

我将深入研究 javascript 对象操作。 在这里我的问题是const me = Object.create(person);const me = person; 之间有什么不同,这两个操作都给了我更苗条的输出。我的意思是它将对象引用到新变量me

const person = {
  isHuman: false,
  printIntroduction: function() {
    console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`);
  }
};

const me = Object.create(person);

me.name = 'Matthew';  
me.isHuman = true;

me.printIntroduction();

const me2 = person;

me.name = 'Manan'; 
me.isHuman = false; 

me.printIntroduction();

在上面的代码中,我包含了直接操作assignment 和使用Object.create(); 进行分配。这里两个变量都引用了对象 person,但是它之间有什么不同呢?有人可以解释一下吗? 以前可能会问过这个问题,但我找不到适当的解释。简单的解释将不胜感激:-)。

【问题讨论】:

  • 如果您打印出人员。你会知道区别
  • @user3562932 你能告诉我它会有什么不同吗?
  • i thing Object.create(person) 我创建新对象而不是分配对象的引用?是吗?
  • 查看文档。特别是,提供的对象用作原型:“Object.create() 方法创建一个新对象,使用现有对象作为新创建对象的原型[链]。”
  • 在这两种情况下都分配了一个对象(新的或其他的)。

标签: javascript node.js object


【解决方案1】:

第一个区别是,当您使用常规赋值时,两个变量都指向同一个对象,当您编辑一个时,您编辑另一个。 create 不会发生这种情况。

const a = {};
const b = a;

b.do = 100;

console.log(a);

const c = Object.create(a);
c.dodo = 100;
console.log(a)

第二个区别是Object.create 创建了一个对象,该对象将第一个对象作为“原型”。原型是对象和继承如何在 javascript 中工作的基础,例如,当您有一个对象时,原型中的默认 toString 方法。见下文

const a = {do : 100};
const c = Object.create(a);
console.log(c.do);
console.log(a.hasOwnProperty("do"));
console.log(c.hasOwnProperty("do"));

如果您在浏览器控制台中运行上述程序然后登录 c,您将看到 doc__proto__ 中。不是直接在c上。

每当您在 javascript 中拥有任何对象并在其上调用属性或方法时,javascript 都会在该对象上搜索它,然后沿着原型链上升。这使您可以节省空间,因此并非每个对象都必须在其上携带共享属性。

有趣的是,{} 拥有对象在其原型中的所有功能,null 没有

const a = Object.create(null);

// works as normal
console.log(a);
a.hello = "hello";
console.log(a);

// error
console.log(a.toString());
console.log(m + m);

编辑:抱歉,当您使用Object.create 并编辑原始版本时出现小错误,您确实看到更改出现在新的原型中。

【讨论】:

    【解决方案2】:

    请记住,person 是对对象的引用。当您执行Object.create() 时,您正在从现有对象创建一个新对象(即新引用)。这个新对象以原始对象为原型。您将此新引用分配给me,您可以在不更改原始person 对象的情况下对其进行修改。

    另一方面,me2 = person 将对person 对象的引用分配给me2。这意味着me2person 都引用同一个对象,更改一个将更改另一个。当您将对象传递给函数时,您会看到这一点。

    简而言之,Object.create() 应该在你想创建一个新对象时使用,而当你想从一个新变量中引用一个现有对象时应该使用赋值。

    【讨论】:

    • Object.create 不会“复制”一个对象。需要进一步澄清。
    • Object.create() 不是简单地复制,它使用原始对象作为原型创建一个新对象
    • @QurakNerd 是的,这是一个糟糕的简化。我在最初的评论之后调整了我的答案,并删除了任何表示“复制”效果的语言。谢谢
    • 是的,你做到了,抱歉我没看到。我
    【解决方案3】:

    Object.create() 方法使用现有的对象创建一个新对象 object 作为新创建对象的原型Object.create

    意味着当你在做的时候

    const me = Object.create(person);
       // you are actually doing  
        me={}
        me.__proto__=person
    

    var person = {
      isHuman: false,
      printIntroduction: function() {
      
        console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`);
        
      }
    };
    
    const me = Object.create(person);
    console.log('isHuman is own Property  obj me:'+me.hasOwnProperty('isHuman'))
    me.name = 'Matthew';  
    me.isHuman = true;
    
    me.printIntroduction();
    debugger
    
    
    const me2 = person;
    console.log('isHuman is own Property obj me2:'+me2.hasOwnProperty('isHuman'))
    
    
    me2.name = 'Manan'; 
    me2.isHuman = false; 
    
    me2.printIntroduction();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-10
      • 2015-06-27
      • 2016-08-20
      • 1970-01-01
      • 2011-03-04
      • 2018-04-20
      • 2010-10-01
      相关资源
      最近更新 更多