使用原型声明方法意味着该方法在任何时候都可用于该原型的实例,只要该实例是在声明方法之后创建的。
在构造函数中声明它this.foo = function(){ ... }
意味着该方法仅在构造函数中声明它的点之后可用。
作为一个简单的例子,让我们看看命名函数和匿名函数。
下面,我们声明一个命名函数并调用它两次。请注意,即使第一次调用是在函数声明之前,该函数从第一次调用开始就可以正常执行:
foo();
function foo()
{
alert("foo");
}
foo();
现在,我们将使用存储在变量中的匿名函数来代替命名函数:现在请注意,第一次调用会导致错误,因为foo
此时未定义。
foo();
var foo = function()
{
alert("foo");
}
foo();
原型以(概念上)类似的方式工作,当我们更改函数的原型时,我们会在创建该函数的实例之前影响它。所以以下工作正常:
function f ()
{
this.bar();
}
f.prototype.bar = function()
{
alert("bar");
};
var f1 = new f();
请注意,它f.prototype.bar
是在我们调用它的行之后物理声明的。现在将其与this. ...
方法进行比较。以下按预期工作
function g()
{
this.h = function(){
alert("h");
};
this.h();
}
var g1 = new g();
虽然这不是因为我们在this.h
为它赋值之前试图调用它:
function g()
{
this.h();
this.h = function(){
alert("h");
};
}
var g2 = new g();
请注意,虽然影响函数原型仍然使用将匿名函数分配给原型属性的机制。这意味着即使使用原型方法,如果我们在向原型添加函数之前实例化原型的实例,我们也会得到错误。例如,以下工作正常:
function f ()
{
this.bar();
}
f.prototype.bar = function()
{
alert("bar");
};
var f1 = new f();
但是如果我们将var f1 = new f();
上面的赋值移动到f.prototype.bar
我们会得到一个错误:
function f ()
{
this.bar();
}
var f1 = new f();
f.prototype.bar = function()
{
alert("bar");
};