我只是想通过与他们玩耍来试探原型,但我不确定我是否能做到这一点。在这个例子中,我原本期望使用在原始函数之外定义的更改来创建原型的新实例:
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功能?
我已经在这里阅读了其他主题,但我认为我还没理解这个推理。如果有人能用他们自己的话来解释,那就太好了。
答案 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());
这里发生了很多事情。
function
,在调用时会在其this
对象上设置属性。new
关键字来创建该函数的两个单独实例。这可确保john
和mary
引用完全独立的对象,每个对象都有自己的first
和last
属性。full
功能Person
媒体资源的prototype
媒体资源中。 prototype
属性存在于所有函数上,并允许您定义应该存在于从该函数创建的每个对象上的后备属性。full()
上调用john
函数。 JavaScript看到john
对象实际上没有full
函数,因此它会查找Person.prototype.full()
函数并调用它。但是,在该调用中,this
仍然引用john
对象。答案 1 :(得分:0)
在上升原型链之前,对象将自行检查。你已经在那个对象上设置了一个属性,它会检查它是否存在。如果它不存在,它将开始上升原型链。
答案 2 :(得分:0)
这里有两件事:
Peeps.x(在Peeps函数内定义) Peeps.prototype.x(在外面定义)
也许有答案:当你删除" x"来自Peeps,它采用现有的原型作为x的模板。这就是你获得这些价值的原因。