为什么要在函数及其原型上设置属性?

时间:2014-05-24 20:50:51

标签: javascript oop prototype

我试图了解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 = '';

我不明白,所以我用该行测试了代码,没有它。

代码在这两种情况下都能正常工作。

所以我的问题是:

为什么作者添加该行?

1 个答案:

答案 0 :(得分:5)

您不应该在原型上设置数据。很多时候从古典语言来到JavaScript的人试图模仿经典继承,但是原型链的不对称性(设置总是本地但得到爬上来链)意味着它不切实际。有关原型继承的更多信息,请click here

原型用于跨实例共享功能。把功能放在那里。对于共享数据,see this answer

那篇把性别放在原型上的文章是错误的。这就是为什么在ES6中,最小的类在原型上设置函数,而不是数据成员。请参阅this article,了解为什么要避免原型上的数据。

我修复了MDN文章,很好听。