静态类、非静态类、静态属性和方法
function Foo(name){ this.name = name; // 私有属性 } var newF = new Foo('xiaoming'); // 实例克隆原型的所有私有属性和方法,并且这些私有属性和方法脱离原型的干扰。
静态方法和属性:无需实例化(new)就可以调用的属性和方法,但是不能被实例对象调用.
1.静态类
var student = { // 以下为静态类的静态方法和静态属性 course: 'math', study: function() { console.log(this.course); } }; student.study();
2.非静态类
function student (course){ // 以下是非静态类的非静态属性和非静态方法 this.course = course; this.study = function() { console.log(this.course); } } // 以下是非静态类的静态属性和静态方法 student.title = 'student'; student.goSchool = function(){ } // 使用prototype属性添加非静态属性和方法 student.prototype.gradeUp = function(){ }; student.prototype.inSchool = 'true';
3.静态属性和静态方法
var Class = function(){ console.log('Class'); }; Class.create = function(){ console.log('Class.create'); }; Class.create(); // Class.create var Klass = new Class(); Klass.create(); // Klass.create is not a function
静态属性和静态方法不能被实例对象调用。
4.实例对象添加属性和方法
4.1.原型添加属性和方法,实例继承
var Class = function(){ console.log('Class'); }; Class.prototype.create = function(){ console.log('Class.prototype.create'); }; var Klass = new Class(); Klass.create(); // Class Class.prototype.create
4.2.实例直接添加属性和方法
var Class = function(){ console.log('Class'); }; var Klass = new Class(); Klass.create = function(){ console.log('Klass.create'); }; Klass.create(); // Class Klass.create
4.3.原型构造函数添加属性和方法
var Class = function(){ console.log('Class'); this.create = function(){ console.log('this.create'); }; }; var Klass = new Class(); Klass.create(); // Class this.create
如果以上三种方法同时使用,哪个优先执行呢?且看下面例子分析
var Class = function(){ console.log('Class'); this.create = function(){ console.log('this.create'); }; }; Class.prototype.create = function(){ console.log('Class.prototype.create'); }; var Klass = new Class(); Klass.create = function(){ console.log('Klass.create'); }; Klass.create(); // Class Klass.create
三种相比,优先执行实例本身的静态方法。
var Class = function(){ console.log('Class'); this.create = function(){ console.log('this.create'); }; }; Class.prototype.create = function(){ console.log('Class.prototype.create'); }; var Klass = new Class(); Klass.create(); // Class this.create
和prototype相比,优先执行构造函数里添加的非静态方法
‘当你读取一个对象的属性时,JavaScript首页会在本地对象(对象本身)中查找这个属性,如果未找到,则开始在对象的原型中查找,若仍未找到,继续查找原型的原型,直到查到这个属性返回这个属性或者至Object.prototype还未发现返回undefined,这就形成了原型链’,还记得这句话吗?看完这个例子,应该对这句话的理解更深了吧。
参考文章:
a.用JAVASCRIPT实现静态对象、静态方法和静态属性
b. javascript中静态方法、实例方法、内部方法和原型的一点见解