我正在阅读几本关于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
实例命名?
答案 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
});