对象赋值“=”和Object.create()有什么区别

man*_*439 4 javascript object node.js

我将深入研究 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();
Run Code Online (Sandbox Code Playgroud)

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

Qur*_*erd 5

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

const a = {};
const b = a;

b.do = 100;

console.log(a);

const c = Object.create(a);
c.dodo = 100;
console.log(a)
Run Code Online (Sandbox Code Playgroud)

第二个区别是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"));
Run Code Online (Sandbox Code Playgroud)

如果您在浏览器控制台中运行上述命令,然后登录 c,您将看到该文件do位于__proto__of中c。不直接在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);
Run Code Online (Sandbox Code Playgroud)

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