静态类、非静态类、静态属性和方法

静态类、非静态类、静态属性和方法

    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中静态方法、实例方法、内部方法和原型的一点见解

此条目发表在JavaScript分类目录。将固定链接加入收藏夹。

发表评论

邮箱地址不会被公开。 必填项已用*标注