2013-01-06 57 views
1

鉴于JavaScript代码:多态constructor.name属性访问

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()); 

...将输出“父”的时候,想要的结果是让“孩子”字符串回(父toString里面执行constructor.name应该返回子构造函数名称)。

这可能在JavaScript?

+1

从https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/constructor,'constructor':_Returns对创建实例的prototype_的Object函数的引用。所以它正在做它应该做的事情,你正在寻找替代功能(除了'constructor'之外的其他功能)。有很多文章模仿古典风格的子类,如果这就是你想要的,或者你也可以去更简单的寄生继承路线。 –

回答

0

您在代码结果看到的不一致是由两个引起reasons.first的一切,如果你检查儿童原型对象与Object.getPrototypeOf(Child)function Empty(){},所以纠正原型对象分配,你应该使用Child.__proto__ = new Parent(),而不是Child.prototype = new Parent();。第二的其所有的事情原型链。如果你看到Object.getPrototypeOf(Child)新的赋值后的结果,你得到[object Object]万一你没有定义父原型toString()方法。如果你有,然后它返回父子原型)原型toString()方法),这意味着儿童具有对象在其原型属性。然后你有三个选择:

1.assign一个toString()方法,以儿童对象本身:

Child.toString = function(){ return this.name } 

在这种情况下,你不应该因为经过原型分配它的构造已更改为使用this.constructor.name父母

2.define儿童原型(父)toString()方法:

Child.__proto__.toString = function(){ return this.name } 

3.define儿童原型的>原型(对象)toString()方法:(倍率

Parent.prototype.toString = function(){ return this.name } 

一些意见:我用__proto__的屁股

1.原因在开始的时候,我想要访问对象构造函数的原始原型属性并改变它。

2.I've使用return this.name因为这些方法会从儿童被调用,因此它refrences子对象。我在选项2prototype选项3使用__proto__

3,原因是我们使用__proto__当对象构造发生了变化,prototype当对象的构造并没有改变。

4.to测试toString()方法你应该使用alert(Child)而不是alert(new Child())

下面是一篇文章,可以帮助你很多关于原型:

http://yehudakatz.com/2011/08/12/understanding-prototypes-in-javascript/

这个答案的所有方面都与Chrome浏览器JS控制台进行测试。