2011-10-07 101 views
2
(function() { 
    window.gArr = new ExtArray(); 
})(); 

function ExtArray() { 
    this.bounce = function() { 
     document.write("Bounced successfully!"); 
    }; 
} 

ExtArray.prototype = new Array; 
ExtArray.prototype.first = function() { 
    document.write(this[0]); 
} 

var eArr = new ExtArray(); 
//all three work 
eArr.bounce(); 
eArr.push("I am first! "); 
eArr.first(); 
// invoking global 
gArr.bounce(); // it works 
gArr.push("No, it is me who is really first! "); // doesn't work 
gArr.first(); // doesn't work 

它为什么不起作用?为什么实例方法没有按预期工作?

+0

什么是观察到的行为?预期的行为是什么?他们有什么不同? –

+0

gArr.push应该工作,gArr.first()应该输出“不,它是我真正的第一个!” – DrStrangeLove

+0

“请注意,构造函数的原型可以在任何时候改变,如果我们重新分配区域,那么rect的新实例将在前几个实例中具有不同的面积方法,更改原型不会影响创建对象的实例。“参考:http://xhalent.wordpress.com/2011/02/16/javascript-object-instantiation-and-prototypes/ –

回答

1
> (function() { 
>  window.gArr = new ExtArray(); })(); 

这是为什么优选只是:

var gArr = new ExtArray(); 

它们是功能上相同的(除非没有窗口对象在这种情况下,首先会失败);

> function ExtArray() { 
>  this.bounce = function() { 
>   document.write("Bounced successfully!"); 
>  }; } 

使用文件撰写后的页面加载完成后会首先清除整个文件(即HTML标签之间的一切),写无论是传递给函数(在这种情况下,两字符串)。

> ExtArray.prototype = new Array; 
> ExtArray.prototype.first = function() { 
>  document.write(this[0]); 
> } 

如上,文件撰写是破坏性的。

> var eArr = new ExtArray(); 
> //all three work 
> eArr.bounce(); 
> eArr.push("I am first! "); 
> eArr.first(); 

推测这是在加载事件之前运行。

> // invoking global 
> gArr.bounce(); // it works 
> gArr.push("No, it is me who is really first! "); // doesn't work 
> gArr.first(); // doesn't work 

说:“不工作”是因为你初始化加尔你修改ExtArray.prototype之前,该位因此它具有实例方法反弹但仍然有默认的原型时,构造被宣布。

请记住,一旦声明完成后,该代码在序列运行所以加尔=新ExtArray()之前ExtArray.prototype =新阵列的运行;等。

此外,一个实例有它的创建和此后不能改变(除了Mozilla的弃用属性)即时引用构造函数的原型内部原型财产。因此,更改contsructor的原型不会改变已经构建的任何实例的内部原型。

1

您应该定义window.gArr定义ExtArray.prototype后:

function ExtArray() { 
    this.bounce = function() { 
     document.write("Bounced successfully!"); 
    }; 
} 

ExtArray.prototype = new Array; 
ExtArray.prototype.first = function() { 
    document.write(this[0]); 
}; // <-- semicolon will be REQUIRED here. 

(function() { 
    window.gArr = new ExtArray(); 
})(); 

DEMO:http://jsfiddle.net/Vg3Ze/

+0

http://jsbin.com/ewamuh/edit我试过了。它返回undefined。 :( – DrStrangeLove

+1

你忘了';'后定义ExtArray.prototype。第一 – lostyzd

+0

@DrStrangeLove:lostyzd是正确的。这将是分号将至关重要的地方。否则,你会立即*调用*'ExtArray.prototype.first'。 – user113716

相关问题