对象赋值符号'='和Object.create()之间有什么区别?

4
我将深入探讨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”,但它们之间有什么区别?可以有人解释一下吗? 可能以前已经有人问过这个问题,但我找不到合适的解答。希望能给出简单易懂的解释 :-)。

4
如果你打印出 "person" 这个词,你会知道它与其他词的区别。 - user3562932
@user3562932,你能简要地告诉我它有什么不同吗? - code7004
我使用 Object.create(person) 创建了一个新对象,而不是分配对象的引用,对吗? - code7004
请查看文档。特别是,提供的对象被用作原型链:“Object.create()方法创建一个新对象,使用现有对象作为新创建对象的原型[链]。” - user2864740
在这两种情况下,都会分配一个对象(新的或其他)。 - user2864740
赋值意味着me2person都是指向同一个对象的引用,因此如果您需要实例化一个新对象,例如me,则可以将me2分配给空对象me2 = {},然后将person分配给它或使用new关键字me2 = new Person() - Ahmed Wahba
3个回答

5
首先的区别是,当您使用常规赋值时,两个变量都指向同一对象,当您编辑其中一个时,另一个也会被编辑。但是使用“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 不会“复制”一个对象。需要更多的澄清。 - user2864740
Object.create() 不仅仅是复制,它使用原型创建一个新对象。 - QurakNerd
1
@QurakNerd 是的,那是一个过于简化的表述。在初始评论后,我调整了我的回答,并删除了任何暗示“复制”效果的语言。谢谢。 - AJ_
啊,是的,你说了,抱歉我没看到。 - QurakNerd

2

Object.create()方法创建一个新对象,使用现有对象作为新创建对象的原型 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();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接