我试图了解JavaScript的OOP模型,所以我正在阅读这篇文章: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript
以下代码很有趣:
function Person(gender) {
this.gender = gender;
alert('Person instantiated');
}
Person.prototype.gender = '';
var person1 = new Person('Male');
var person2 = new Person('Female');
//display the person1 gender
alert('person1 is a ' + person1.gender); // person1 is a Male
有趣且不清楚的是这一行:
Person.prototype.gender = '';
我不明白,所以我用该行测试了代码,没有它。
代码在这两种情况下都能正常工作。
所以我的问题是:
为什么作者添加该行?
答案 0 :(得分:5)
您不应该在原型上设置数据。很多时候从古典语言来到JavaScript的人试图模仿经典继承,但是原型链的不对称性(设置总是本地但得到爬上来链)意味着它不切实际。有关原型继承的更多信息,请click here。
原型用于跨实例共享功能。把功能放在那里。对于共享数据,see this answer。
那篇把性别放在原型上的文章是错误的。这就是为什么在ES6中,最小的类在原型上设置函数,而不是数据成员。请参阅this article,了解为什么要避免原型上的数据。
我修复了MDN文章,很好听。