Javascript原型更改未在实例

时间:2015-08-12 19:14:05

标签: javascript inheritance prototype

我只是想通过与他们玩耍来试探原型,但我不确定我是否能做到这一点。在这个例子中,我原本期望使用在原始函数之外定义的更改来创建原型的新实例:

function Peeps (){
    this.x = "old"
};
Peeps.prototype.x = "new";

var peep1 = new Peeps();
peep1.x; //still "old"

delete peep1.x;
peep1.x; //now "new" 

我知道在最后一行中,x&#34的新原型值闪现在"因为我删除了对象的原生x(这是" old")所以它在原型链中向上搜索另一个x。 我想我的问题是:为什么x" old"在对象的第一位?代码是否看起来不是新对象的原始Peeps原型函数,即使其中一个原型属性之前已经更改,但是当它无法在对象中找到原生x时,它看起来超出了原来的Peeps功能?

我已经在这里阅读了其他主题,但我认为我还没理解这个推理。如果有人能用他们自己的话来解释,那就太好了。

3 个答案:

答案 0 :(得分:2)

  

为什么x" old"在对象的第一位?代码是否看起来不是新对象的原始Peeps原型函数,即使其中一个原型属性之前已经更改,但是当它无法在对象中找到原生x时,它看起来超出了原来的Peeps功能?

右。原型旨在提供与继承在其他语言中提供的功能类似的功能。您可以使用.prototype来表示"大多数Peeps以这种方式行事"。但是因为你的"构造函数" function(通过new Peeps()调用)在此特定实例中设置一个属性,该属性优先于原型。

  

我已经在这里阅读了其他主题,但我认为我还没理解这个推理。如果有人能用他们自己的话来解释,那就太好了。

以下是an article I wrote的摘录,可能有所帮助:

JavaScript使用特殊的prototype属性来解决其他语言使用类来解决的问题。请考虑以下事项:

function Person(first, last)
{
    this.first = first;
    this.last = last;
}
var john = new Person("John", "Doe");
var mary = new Person("Mary", "Deer");
Person.prototype.full = function() {return this.first + " " + this.last;};
alert(john.full());

这里发生了很多事情。

  1. 我们创建了一个function,在调用时会在其this对象上设置属性。
  2. 我们通过在函数调用之前放置new关键字来创建该函数的两个单独实例。这可确保johnmary引用完全独立的对象,每个对象都有自己的firstlast属性。
  3. 我们创建了一个新功能,并将其分配到full功能Person媒体资源的prototype媒体资源中。 prototype属性存在于所有函数上,并允许您定义应该存在于从该函数创建的每个对象上的后备属性。
  4. 我们在full()上调用john函数。 JavaScript看到john对象实际上没有full函数,因此它会查找Person.prototype.full()函数并调用它。但是,在该调用中,this仍然引用john对象。

答案 1 :(得分:0)

在上升原型链之前,对象将自行检查。你已经在那个对象上设置了一个属性,它会检查它是否存在。如果它不存在,它将开始上升原型链。

答案 2 :(得分:0)

这里有两件事:

Peeps.x(在Peeps函数内定义) Peeps.prototype.x(在外面定义)

也许有答案:当你删除" x"来自Peeps,它采用现有的原型作为x的模板。这就是你获得这些价值的原因。