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
назначение ранее ранее в вашем коде.