Polymorphic constructor.name属性访问

时间:2013-01-06 15:57:53

标签: javascript

给出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中是否可行?

1 个答案:

答案 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控制台进行测试。