Object.create () и toString () - PullRequest
       31

Object.create () и toString ()

4 голосов
/ 19 декабря 2011

С учетом этих кодов

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 ]

3 голосов
/ 19 декабря 2011

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

var test4 = Object.create(Person);

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

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

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

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

0 голосов
/ 19 декабря 2011
var Person = function(firstName, lastName) { 
    this.firstName = firstName; 
    this.lastName = lastName;
  }; var p1=new Person("Phat1","Wang1");

p1 - Объект

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

p2 - это функция

0 голосов
/ 19 декабря 2011

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

Вы объявили функцию 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, то, что происходит в его реализации, это новый объект, который будет создан заново,и затем он вернет тот новый объект, который переопределит свойство прототипа, которое, как предполагал javascript, вы создали, выполнив это Person.prototype присваивание, ранее ранее в вашем коде.

...