gpt4 book ai didi

javascript - JS中原型(prototype)构造器的使用

转载 作者:可可西里 更新时间:2023-11-01 02:35:58 24 4
gpt4 key购买 nike

有人可以向我解释 Me.prototype.constructor = Me; 的用法吗?当这段代码可以正常工作或没有它时,为什么需要它?

在代码中,原型(prototype)对象是在 Me 对象上创建的,它被实例化并替换了旧的原型(prototype)对象。为什么我需要在放弃的代码中指向 Me 构造函数?

function Me(){
this.name = 'Dejan';

}

function You(){
this.name = 'Ivan';
}

Me.prototype = new You();

somebody = new Me();

Me.prototype.constructor = Me; // Why?

Me.prototype.foo = function(){
alert('Proto Me!'); // It always fire up this alert, ether constructor is pointing to Me or not... !
}

You.prototype.foo = function(){
alert('Proto You!');
}

somebody.foo();
alert(somebody.name); // Alert 'Dejan'

最佳答案

这不是必需的,而且 instanceof 甚至不需要它,这与普遍的看法相反(instanceof 在内部检查原型(prototype)链并且不需要构造函数属性)。通常,constructor 本质上是构造函数的 prototype 上的不可枚举属性。因此,为该构造函数实例化的任何对象提供一个不可枚举的 constructor 属性,指向该构造函数。

如果需要,最好把它放在那里,最好是不可枚举的。某些代码会假定对象上存在 .constructor

在您发布的代码中,是的,当以这种方式进行继承时,有必要重置构造函数(如果您想要它),因为您实例化为充当子原型(prototype)的对象具有指向错误构造函数的构造函数属性(它的构造函数)。

在 ES5 中,你会这样做:

Child.prototype = Object.create(Parent.prototype, {
constructor: { value: Child, enumerable: false }
});

编辑:另外,可能值得一提的是,当使用非标准的 __proto__ 进行继承时,没有必要重置构造函数,因为 __proto__ 只是指定对象的原型(prototype),也就是说,当自己的属性不存在时,将在其上执行查找的对象。一个新的 prototype 总是有一个名为 constructor 的属性。

这样做:

var child = function() {};
child.prototype.__proto__ = parent.prototype;

您不必设置构造函数,因为 child.prototype 的基本构造函数属性仍然存在。如果访问,则不需要执行原型(prototype)链查找。

关于javascript - JS中原型(prototype)构造器的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6884830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com