鉴于这些代码
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
不同,但我不明白......
聚苯乙烯。我试过搜索线程仍然无法回答自己。对不起,如果这与任何重复。
答案 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是一个函数