如果
采取一个例子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()
不会出现。如果原型只是另一个没有神奇优势的属性那么为什么这种行为?提前谢谢!
答案 0 :(得分:8)
使用new
时,函数的prototype
属性将用作实例对象的内部[[Prototype]]
属性的模板。这在某些浏览器中显示为__proto__
,而不是与prototype
混淆,而prototype
只是一个常规属性。
当您将属性直接附加到函数时,而不是prototype
,您基本上将该函数用作命名空间。由于函数是对象,因此它们可以具有任意属性,而其他属性是内置的,例如name
和this
。实际上,您正在创建类似于静态方法的东西,它不依赖于实例,不会使用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();