给出JavaScript代码:
function Parent() { ... }
function Child() { ... }
Child.prototype = new Parent();
// toString implementation on the parent object
Parent.prototype.toString = function() {
return this.constructor.name;
}
// And the code:
alert(new Child());
...当想要的结果是返回“Child”字符串时,将输出“Parent”(父constructor.name
实现中的toString
应该返回子构造函数名称。) p>
这在JavaScript中是否可行?
答案 0 :(得分:0)
您在代码结果中看到的不一致是由两个原因引起的。首先,如果您使用Object.getPrototypeOf(Child)
检查Child原型对象,则得到function Empty(){}
,因此要更正原型对象分配,您应该使用Child.__proto__ = new Parent()
代替Child.prototype = new Parent();
。其次是原型链。如果您在新分配后看到Object.getPrototypeOf(Child)
的结果,则会得到[object Object]
1}}(如果你还没有定义父原型toString()方法。如果你有,那么它返回Parent(子原型)原型toString()方法)这意味着Child有一个<在原型属性中强>对象。然后你有三个选择:
1.将toString()方法分配给Child Object本身:
Child.toString = function(){ return this.name }
在这种情况下,您不应使用this.constructor.name
,因为在原型分配后,其构造函数已更改为 Parent 。
2.define Child prototype(Parent)toString()方法:
Child.__proto__.toString = function(){ return this.name }
3.define Child prototype-&gt; prototype(Object)toString()方法:( override )
Parent.prototype.toString = function(){ return this.name }
一些观察结果:
1.我在开头使用__proto__
进行分配的原因是我想访问对象构造函数的原始prototype属性并进行更改。
2.我使用了return this.name
,因为这些方法将从Child调用,因此它会引用子对象。
3.我在选项2 中使用__proto__
并在选项3 中使用prototype
的原因是我们使用__proto__
当Object构造函数发生更改时,以及当Object构造函数未更改时prototype
。
4.测试toString()
方法,您应使用alert(Child)
而不是alert(new Child())
。
这篇文章可以帮助您解决原型问题:
http://yehudakatz.com/2011/08/12/understanding-prototypes-in-javascript/
此答案的所有方面均使用Chrome JS控制台进行测试。