我在MDN注意到他们说:“不推荐重新定义原型”并且他们给出了重新定义原型的示例以及如何通过附加到原型来更好地完成原型的示例现有的原型而不是重新定义原型。
我特别想知道这个,因为我们需要重新定义原型的其他情况:
Cube.prototype = Object.create(....)
Manager.prototype = new Employee;
MDN是不是说你不应该像他们给出的例子那样重新定义原型(如下所示),但实际上可以在上面提到的情况下重新定义它?
这里(释义)就是他们在MDN页面上所说的内容:
//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;
};
我的问题:这是正确的,如果是这样的话,你可以提出一些内幕细节来回答原因。特别是看MDN示例 - 为什么一种方式实际上比另一种方式更好?
一个快速说明:我喜欢MDN并欣赏该网站上的所有工作!我上面的评论只是一个问题,所以我可以理解重新定义原型的规则,而不是对他们所说的内容的任何批评。
答案 0 :(得分:5)
以下是两种方法的区别:
当您重新定义原型时,您将删除项目上存在DID的所有属性,并且您将为其提供一个全新的集合。一种刀耕火种的做法。
另一方面,当您添加新属性时,如第二个示例所示,您将保留任何存在的内容并只添加该属性。
扩展而不是覆盖对象往往会更灵活,更容易调试,但它实际上归结为风格问题。
如果你是从一个新构造的对象开始,两种方法都完全相同。
如果您从现有对象开始,则第二种形式是唯一有意义的形式。