(function(){
var BaseClass =function (){}
BaseClass.staticMethod = function(){
alert(‘staticMethod ‘);
}
BaseClass.prototype.instaceMethod = function(){
alert(‘instaceMethod ‘);
}
var instace = new BaseClass();
BaseClass.staticMethod();//staticMethod
instace.instaceMethod();//instaceMethod
instace.staticMethod();//不输出
BaseClass.instaceMethod();//不输出
})()
结论就可以得出静态方法是类直接调用,实例方法要new 出来的对象才能调用。
instace.staticMethod();//不输出 这一点说明instace跟BaseClass本质上依然是两个独立的对象,正常情况下不能相互访问内部元素。
BaseClass.instaceMethod();//不输出 这里引出一个疑问,为什么定义在自己的prototype属性上的方法自己却不能访问,new一下就能访问了呢?
首先来看BaseClass为什么不能访问instaceMethod。
通过alert(typeof(BaseClass.prototype))输出object,所以prototype也是一个对象,所以BaseClass.prototype跟BaseClass是两个相互独立的对象,没有必要转化的话做不到相互访问。
为什么会造成这种差异呢?这需要看new都做了什么:
var instace = new BaseClass();相当于
- var instace = {};//创建新的object对象,所以他的数据类型是object
- instace .__proto__ = BaseClass.prototype;//获取原型链,所以instace 能访问BaseClass.prototype
- BaseClass.call(instace);//对象替换,instace替换掉BaseClass
以上可以看出JavaScript 静态方法和动态方法有本质的不同,静态方法就是本身自己的方法,而动态方法是prototype上的方法。
未经允许不得转载:前端撸码笔记 » JavaScript 静态方法和动态方法以及他们的不同