Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript对象:重新定义原型不好吗?_Javascript_Object_Prototype - Fatal编程技术网

Javascript对象:重新定义原型不好吗?

Javascript对象:重新定义原型不好吗?,javascript,object,prototype,Javascript,Object,Prototype,我注意到,他们说:“不建议重新定义原型”,他们给出了一个重新定义原型的例子,以及一个如何通过附加现有原型而不是重新定义原型来更好地完成这项工作的例子 我特别想知道这一点,因为在其他类似的情况下,我们需要重新定义原型: Cube.prototype = Object.create(....) Manager.prototype = new Employee; MDN是不是说你不应该为他们给出的例子(如下所示)重新定义原型,但实际上可以为我刚才提到的情况重新定义原型 下面(意译)是他们在页面上所说

我注意到,他们说:“不建议重新定义原型”,他们给出了一个重新定义原型的例子,以及一个如何通过附加现有原型而不是重新定义原型来更好地完成这项工作的例子

我特别想知道这一点,因为在其他类似的情况下,我们需要重新定义原型:

Cube.prototype = Object.create(....)
Manager.prototype = new Employee;
MDN是不是说你不应该为他们给出的例子(如下所示)重新定义原型,但实际上可以为我刚才提到的情况重新定义原型

下面(意译)是他们在页面上所说的:

我的问题:这是正确的吗?如果是,你能透露一些秘密细节来回答为什么吗。特别是看看MDN示例——为什么一种方法实际上比另一种方法好?


一个简短的提示:我喜欢MDN,并感谢该网站上的所有工作!我上面的评论只是一个问题,因此我可以理解重新定义原型的规则,而不是对他们所说的任何批评。

以下是两种方法的区别:

当您重新定义原型时,您正在删除该项上确实存在的所有属性,并为其提供一个全新的集合。有点像刀耕火种的方法

另一方面,当您添加一个新属性时,如第二个示例所示,您将保留现有的任何内容,只需添加该属性即可

扩展,而不是覆盖,一个对象往往更灵活,更容易调试,但它实际上归结为一个风格问题

如果您是从一个新构造的对象开始,那么这两种方法的作用完全相同


如果您从现有对象开始,第二种形式是唯一有意义的形式。

如果您确实打算这样做,那么重新定义原型没有什么错。我假设mdn是这样写的,因为新开发人员可能不清楚执行
obj.prototype={…}
会丢失现有的原型方法。如果您不注意并重新定义原型,您可能会丢失对象的一些功能。如果您稍后尝试调用丢失的方法,它将抛出一个错误,表示它未定义。谢谢您的解释!很抱歉,我无法进行“投票”,因为我没有足够的声望点数(需要15分)——但我确实将答案标记为已回答。我所能要求的是——很高兴我能提供一些帮助。
//MDN says this is not the best way since it redefines the prototype

function MyObject(name, message) {
 this.name = name.toString();
 this.message = message.toString();
}
MyObject.prototype = {
 getName: function() {
  return this.name;
 },
 getMessage: function() {
  return this.message;
 }
};

//MDN says this is better to do it this way since this does not
//redefine the prototype:

function MyObject(name, message) {
 this.name = name.toString();
 this.message = message.toString();
}
MyObject.prototype.getName = function() {
 return this.name;
};
 MyObject.prototype.getMessage = function() {
return this.message;
};