Object.create()和toString()

时间:2011-12-19 04:32:25

标签: javascript inheritance object prototypal-inheritance

鉴于这些代码

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.toStringtest5.toString不同,但我不明白......

聚苯乙烯。我试过搜索线程仍然无法回答自己。对不起,如果这与任何重复。

3 个答案:

答案 0 :(得分:3)

而不是:

var test4 = Object.create(Person);

你应该这样做:

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

您拥有它的方式,test4在其原型链中具有Person 函数,而不是具有toString方法的预期原型对象。 / p>

因此,它正在使用toString()方法,显然预计会针对Function对象进行调用。

答案 1 :(得分:0)

分配原型和为对象的原型分配新属性之间存在差异。

你将一个函数Person声明为构造函数,但是你通过这样做几乎为它的原型赋值:

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

这意味着您将一个新的对象键值对toString-function分配给Person.prototype,而不是实际向其添加新属性,您应该这样做:

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

由此产生的是,当您实际创建一个通过调用Object.create从Person对象继承的新对象时,在其实现中会发生的事情是新对象将被新创建,然后它将返回这个新对象将覆盖javascript假定您通过先前在代码中执行Person.prototype赋值而创建的prototype属性。

答案 2 :(得分:0)

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是一个函数