了解函数的原型属性

时间:2015-07-07 19:05:23

标签: javascript prototype

如果

采取一个例子
var Func = function(){}

这里Func有一个名为prototype的属性,我可以添加我的自定义方法,如下所示。

Func.prototype.move = function(){ //do something }

根据我的理解,原型只是Func的另一个属性,默认情况下由解释器提供,不用于委托任何功能,即。没有什么比像

Func.move()

应用相同的逻辑我正在创建具有相同功能的另一个属性,如下面的

Func.method = function(){ //do something }

现在如果创建一个新对象

var obj = new Func();

此处有obj.move(),但obj.method()不会出现。如果原型只是另一个没有神奇优势的属性那么为什么这种行为?提前谢谢!

5 个答案:

答案 0 :(得分:8)

使用new时,函数的prototype属性将用作实例对象的内部[[Prototype]]属性的模板。这在某些浏览器中显示为__proto__,而不是与prototype混淆,而prototype只是一个常规属性。

当您将属性直接附加到函数时,而不是prototype,您基本上将该函数用作命名空间。由于函数是对象,因此它们可以具有任意属性,而其他属性是内置的,例如namethis。实际上,您正在创建类似于静态方法的东西,它不依赖于实例,不会使用ResultSet rs = statement.executeQuery("SELECT * FROM groups"); rs.setFetchSize(100); // <-- Add this to fetch 100 rows at a time.

答案 1 :(得分:4)

函数的prototype属性确实有一个特殊目的:它将被设置为使用此函数作为构造函数创建的对象的内部原型(即,当您使用new时)。

所以当你写var obj = new Func();时,obj没有拥有属性move,但是当查找失败时,它会被委托向上原型链:到obj的原型,它是你之前设置的Func.prototype,它有一个移动方法。

另一方面,向Func添加move只是创建函数本身的属性(函数也是对象,所以你可以为它们添加属性) - 你可以用{{{ 1}},但它基本上与Func.move()无关。

如果您想了解更多关于函数原型属性如何工作的信息,我建议使用Eloquent Javascript的章节The Secret Life of Objects

答案 2 :(得分:1)

使用move,您可以将函数添加到对象的原型中,因此它可用于新创建的对象。 使用方法,您将函数添加到已创建的对象Func。

答案 3 :(得分:1)

prototype属性用于查找prototype chain中的属性/函数。因此,当您首先property询问object object时,object本身会查找prototypical chain本身,如果找不到,则会通过Object method进行搜索} upto Func。特别是对于您的示例,您直接在Func对象上添加了move属性,因此仅在Func&amp;上的该实例上可用。您正在将prototypical chain lookup属性添加到explain的原型中,因此可以通过datePicker.getJFormattedTextField().getText() 将其提供。

答案 4 :(得分:0)

以下代码应解释其中的差异:

Func = function(){};

Func.prototype.move = function(){ 
    alert('move');
}

Func.method = function(){ 
    alert('method');
};

var obj = new Func();
//valid since move is defined using prototype and hence available on all instances of Func
obj.move(); 
//valid since you just added a method to Func and invoking it directly using Func
Func.method();

//invalid since method was not defined using prototype
obj.method();
//invalid since move was not defined using prototype and hence available only on instances of Func and not as a property of Func
Func.move();