JavaScript原型和这种继承

JavaScript原型和这种继承,javascript,prototype,Javascript,Prototype,下面是一个来自Javascript is sexy站点的示例: function People () { ​this.superstar = "Michael Jackson"; } People.prototype.athlete = "Tiger Woods"; ​// Define "athlete" property on the People prototype so that "athlete" is // accessible by all objects that use t

下面是一个来自Javascript is sexy站点的示例:

function People () {
​this.superstar = "Michael Jackson";
}

People.prototype.athlete = "Tiger Woods";

​// Define "athlete" property on the People prototype so that "athlete" is
// accessible by all objects that use the People () constructor.
我的问题:
people.prototype.atternate
继承属性atternate与在people构造函数
this.atternate=“Tiger Woods”中继承属性atternate有什么区别

在注释中,它说所有使用
People()
构造函数的对象都可以访问
atternate

但是当我把这个属性放入people构造函数中时,所有使用
people()
构造函数的对象都可以访问它

1和2的区别是什么

//1
function People () {
​this.superstar = "Michael Jackson";
}
People.prototype.athlete = "Tiger Woods";

//2
function People () {
​this.superstar = "Michael Jackson";
this.athlete = "Tiger Woods"; 
}
使用示例#1创建对象时:

我知道
运动员
财产不是
个人
对象所有


但是还有什么不同呢?

简短的回答:内存共享

另一方面,因为原型只对“老虎伍兹”有一次价值,所以每个
人的实例对
超级明星都有自己的价值。在这种情况下,我认为内存通常是用字符串优化的(如果我错了,请纠正我),但如果它是一个对象,例如,它将是一个不同的故事,每次你实例化
人时都会定义一个新对象


另外,如果您修改
People.prototype.atternate
,则
People
(任何位置)的任何实例的每个默认值都将是新定义的值(如果您通过,
instance.atternate
覆盖一个或多个实例,那么这并不重要)。

这基本上是唯一的区别。(当然还有
Person.prototype.hasOwnProperty(…)
)然而,这种差异的含义是巨大的……尝试构建一些实例,然后更改
Person.prototype.athletor
,以了解属性继承的实际含义!可能重复您所说的“如果您修改People.prototype.athletator,任何人员实例(任何位置)的每个默认值都将是新定义的值”这是真的,但在2个示例中,如果我修改this.athletator(在构造函数内)它还更改人员构造函数的任何实例的值。每个实例只调用一次构造函数。这意味着您不能更新人员构造函数(实例化后),并希望它能改变以前实例化的人员,prototype的优点之一是,如果您修改它,过去的实例字段也会被修改(如果实例实例化后字段没有被直接覆盖).谢谢你,阿杜奇,但你能给我举个例子,让我更好地理解你说的话吗?
var person = new People();
console.log(person.hasOwnProperty('superstar')); //TRUE
console.log(person.hasOwnProperty('athlete'));  // FALSE