在工作中遇到了一个问题,就是在调用一个类时忘记加new这个字符了。结果导致调用prototype下面的函数时,报错提示说没有这个函数。在网上查了一下,原来如此:
prototype对象是实现面向对象的一个重要机制。 每个函数就是一个对象(Function),函数对象都有一个子对象 prototype对象,类是以函数的形式来定义的。prototype表示该函数的原型,也表示一个类的成员的集合。 在通过new创建一个类的实例对象的时候,prototype对象的成员都成为实例化对象的成员。 1、该对象被类所引用,只有函数对象才可引用; 2、在new实例化后,其成员被实例化,实例对象方可调用。 同时,函数是一个对象,函数对象若直接声明成员,不用被实例化即可调用。 其实总结下意思就是加了prototype的对象是不会被实例化的,是一个静态的方法 所以一个类,如果你想要调用prototype下面的方法,你就在需要调用这个类的地方加上new这个字符。如:new APP.Pager({xx:xx,xxx:xxx,....}); 否则就可以直接调用这个类如:APP.Pager({xx:xx,xxx:xxx,...});
附上类的加prototype和不加prototype的一种写法,当然还有其他的写法,但都大同小异:
APP.Pager= function(){
} ;
APP.Pager.say=function{
};
----------------------------
APP.Pager =function (){
};
APP.Pager.prototype.say=function{
};
最后做了一个测试,测试代码,输出内容以及最后的结论见截图:
下面附上源代码:
function Eq(){
this.a = "aaa";
Eq.getA = function(){ //静态的方法
alert("bbb");
alert(this.a);//undefined
}
Eq.prototype.getB = function(){ //非静态的方法
alert(this.a);
}
}
var eq = new Eq();
// eq.getA();//TypeError: eq.getA is not a function
Eq.getA();//bbb
// eq.getB();//aaa
// Eq.getB();//TypeError: Eq.getB is not a function
结论是:函数里面的非prototype下面的方法可以只能通过类名直接调用,prototype下面的方法只能通过类的实例(即new后的对象)来调用。
1)不使用prototype属性定义的对象方法,是静态方法,只能直接用类名进行调用!另外,此静态方法中无法使用this变量来调用对象其他的属性!
2)使用prototype属性定义的对象方法,是非静态方法,只有在实例化后才能使用!其方法内部可以this来引用对象自身中的其他属性!