Создание экземпляра объекта с использованием оператора «новый» работает, но использование Object.create () не дает тех же результатов. - PullRequest
2 голосов
/ 26 мая 2020

Здесь немного похоже на JavaScript newb ie. У меня есть следующие 2 JavaScript фрагментов кода, которые не делают того, что я ожидаю. В примерах создается экземпляр объекта «Person» в примере №1 с помощью оператора «new» и создается прототип объекта «Person» в примере №2 с использованием свойства ES5 Object.create ().

let Person = function(name, age, city) {
    this.name = name;
    this.age = age; 
    this.city = city
}

// Using 'new' operator (working)
let person1 = new Person("Jack Rabit", 40, "Seattle");
Object.values(person1); // Shows "Jack Rabit", 40, "Seattle"

Но выполнение следующих действий с использованием свойства Object.create () ... не отображает первое значение свойства (в данном случае «имя»):

let person2 = Object.create(Person);
person2.name = "Will"; 
person2.age=41; 
person2.city="San Jose";

Object.values(person2); // Shows 41, "San Jose" (Does NOT show the value of the "name" property)

Что это такое? отсутствует?

Ответы [ 4 ]

2 голосов
/ 26 мая 2020

Обычно, когда я использую Object.create(), я передаю объект, который будет использоваться в прототипе. В настоящее время вы передаете функцию в качестве аргумента. Этот способ работает

const Person = function(name, age, city) {
    this.name = name;
    this.age = age; 
    this.city = city
}

const person2 = Object.create(new Person());
person2.name = "Will"; 
person2.age=41; 
person2.city="San Jose";

Object.values(person2);

Вероятно, это как-то связано с тем, что функции имеют собственное свойство name для самой функции? Но я не совсем уверен

Отредактировано:

Подтверждено, что это просто из-за свойства name, изменил имя на заголовок, чтобы избежать путаницы:


const Person = function(title, age, city) {
    this.title = title;
    this.age = age; 
    this.city = city
}

const person2 = Object.create(Person);
person2.title = "Will"; 
person2.age=41; 
person2.city="San Jose";

Object.values(person2);
// ["Will", 41, "San Jose"]

1 голос
/ 26 мая 2020

Object.create создает новый объект с данным объектом как его [[prototype]].

Здесь вы пытаетесь наследовать свойства по ошибке. Вы создаете объект person2 с функцией конструктора Person в качестве его прототипа. Все функции имеют неперечисляемое и недоступное для записи свойство, называемое name. Вы можете видеть, что по

Object.getOwnPropertyDescriptor(Person, "name")

Строка person2.name = "Will"; эффективно пытается перезаписать это свойство и ничего не делает. Также person2 фактически стал функцией.

Здесь правильное использование будет

let person2 = Object.create(new Person()); 
0 голосов
/ 26 мая 2020

Object.create требуется объект для создания другого объекта, в результате, поскольку Person, будучи функцией (точнее, конструктором функции), также является объектом в javaScript. Поэтому Object.create не будет жаловаться, но то, что происходит под капотом, когда это делается таким образом:

let person2 = Object.create(Person);

person2 в конечном итоге получает назначение некоторых свойств функции с именем 'Person' (которая сам по себе не является функцией, его нельзя вызвать) это можно увидеть здесь:

// person2.name = 'Person'

// person2() Uncaught TypeError: person2 is not a function at <anonymous>:1:1

Как одно из унаследованных свойств функции, ее имя доступно только для чтения, поэтому person2.name = 'some name' будет не имеют никакого эффекта. Function.name MDN docs

Оператор new вызовет конструктор, который вернет объект, наследуя прототип функции конструктора

0 голосов
/ 26 мая 2020

Object.create нужен объект для создания другого объекта. Поэтому используйте функцию Person, чтобы вернуть объект. Это должно выглядеть так:

 let Person = function(name, age, city) {
  return {
    name,
    age,
    city
  };
}

// Using 'new' operator (working)
let person1 = new Person("Jack Rabit", 40, "Seattle");

let person2 = Object.create(Person());
person2.name = "Will"; 
person2.age=41; 
person2.city="San Jose";
...