为什么实例构造函数指向最顶层的函数构造函数对象?

时间:2013-11-30 21:25:44

标签: javascript

我正在阅读几本关于JavaScript的书籍,以提高我的技能。

我遇到了一个对象构造函数的问题,因为我希望它能给我一个函数来生成一个带有new关键字调用的对象,但它给了我一个顶级函数,其原型为{{ 1}}。

请查看此代码

Object

为什么var Top = function() { this.name = 'Top'; }; var Middle = function() { this.name = 'Middle'; } var Bottom = function() { this.name = 'Bottom'; } Middle.prototype = new Top(); Bottom.prototype = new Middle(); btm = new Bottom(); // I understand this, it gives me instance of Middle console.log(Bottom.prototype); // I don't understand this, I expected to see the same console.log(btm.constructor.prototype); 指向btm.constructor这对我来说很奇怪,我想了解这种行为。我如何访问Middle>仅通过Top实例命名?

2 个答案:

答案 0 :(得分:1)

您必须在底层类上设置构造函数:

Bottom.prototype.constructor = Bottom;

答案 1 :(得分:0)

这是因为你在执行此操作时销毁了原来的.constructor属性:

Bottom.prototype = new Middle();

只有函数上的默认.prototype对象才会获得指向该函数的自动.constructor属性。

如果您覆盖它,则需要手动将其重新插入。

console.log(Bottom.prototype.constructor === Bottom); // true

Bottom.prototype = new Middle();

console.log(Bottom.prototype.constructor === Bottom); // false

Bottom.prototype.constructor = Bottom;

console.log(Bottom.prototype.constructor === Bottom); // true

或者在较新的浏览器中,使用Object.defineProperty()

Object.defineProperty(Bottom.prototype, "constructor", {
    value: Bottom,
    writable: true,
    enumerable: false,
    configurable: true
});