Object.create() и toString()

Учитывая эти коды

var Person = function(firstName, lastName) {
  this.firstName = firstName;
  this.lastName = lastName;
};

Person.prototype = {
  toString: function() { return this.firstName + ' ' + this.lastName; }
};

var test4 = Object.create(Person);
test4.firstName = "Phat4";
test4.lastName = "Wang4";
console.log(test4.toString === Object.toString); // true
console.log(test4.toString === Function.toString); // true

var test5 = { firstName: "Phat5", lastName: "Wang5" };
console.log(test5.toString === test4.toString); // false
console.log(test4.toString === Function.toString); // true
console.log(test5.toString === Object.prototype.toString); // true

console.log(test5.toString()); // [object Object]
console.log(test4.toString()); // Function.prototype.toString called on incompatible object

Почему последняя строка console.log(test4.toString()) выдает ошибку? Это показывает, что test4.toString не похоже test5.toString но я не понимаю..

Ps. Я пытался искать темы и до сих пор не могу ответить сам. Извините, если это дублирует любой.

3 ответа

Решение

Вместо этого:

var test4 = Object.create(Person);

Вы должны делать:

var test4 = Object.create(Person.prototype);

То, как ты это сделал, test4 имел Person функция в своей цепочке прототипов, а не предполагаемый объект-прототип, который имеет ваш toString метод.

Из-за этого он использовал toString() метод, который, очевидно, ожидает вызова против Function объект.

var Person = function(firstName, lastName) { 
    this.firstName = firstName; 
    this.lastName = lastName;
  }; var p1=new Person("Phat1","Wang1");

р1 является объектом

var p2= Object.create(Person);
p2.firstName="Phat2";
p2.lastName="Wang2";

р2 является функцией

Существует разница между назначением прототипа и назначением нового свойства прототипу объекта.

Вы объявили функцию Person как функцию конструктора, но затем вы в значительной степени назначаете ее прототипу, выполняя это:

Person.prototype = {
  toString: function() { return this.firstName + ' ' + this.lastName; }
};

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

Person.prototype.toString = function() { return this.firstName + ' ' + this.lastName; }

Из этого следует, что когда вы фактически создаете новый объект, который наследуется от объекта Person, вызывая Object.create, то, что происходит в его реализации, это новый объект, который будет создан заново, и затем он вернет тот новый объект, который переопределит свойство prototype, которое, как предполагал javascript, вы создали. Person.prototype назначение ранее ранее в вашем коде.

Другие вопросы по тегам