(1) basic javascript class


1 version 1

var Class = function(){
        var klass = function(){
            this.init.apply(this,arguments);
        };
        //init
        klass.prototype.init = function(){};
        return klass;
    };

    var Person = new Class();

    Person.prototype.init = function(){
        this.name = "Jackey";
    };

    Person.prototype.find = function(){
        console.log(this.name);
    };
    
    var person = new Person();
    person.find();


(1)

var Person = new Class();


为了制造出这样的效果,我们要先写一个Class的function,实例化后返回一个function:

var Class = function(){
        var klass = function(){};
        return klass;
    };

(2) 给返回function 添加一个程序的入口

var Class = function(){
        var klass = function(){
            this.init.apply(this,arguments);
        };
        //init
        klass.prototype.init = function(){};
        return klass;
    };

这就意味着,返回的function原型的init的this指针变量都会被引用到klass里面

(3)编写类,通过原型去扩展自己的function

 var Person = new Class();

    Person.prototype.init = function(){
        this.name = "Jackey";
    };

    Person.prototype.find = function(){
        console.log(this.name);
    };

    var person = new Person();
    person.find();

 2 version 2

var Class = function(){
        var klass = function(){
            this.init.apply(this,arguments);
        };
        //init
        klass.prototype.init = function(){};
        klass.fn = klass.prototype;
        klass.fn.parent = klass;
        //add class property
        klass.extend = function(obj){
            var extended = obj.extended;
            for(var i in obj){
                klass[i] = obj[i];
            }
            if(extended) extended(klass);
        };
        //add prototype property
        klass.include = function(obj){
            var included = obj.included;
            for(var i in obj){
                klass.fn[i] = obj[i];
            }
            if(included) included(klass);
        };
        return klass;
    };

    var Person = new Class();

    Person.prototype.init = function(){
        this.name = "Jackey";
    };

    Person.prototype.find = function(){
        console.log(this.name);
    };

    Person.include({
       get:function(){
           return this.name
       },
        set:function(value){
            this.name = value;
        }
    });

    var person = new Person();
    console.log(person.get());//Jackey
    person.set("Jackey Sparrow")
    console.log(person.get());//Jackey Sparrow

对比上一个版本,这个版本多了一个extend和一个include,分别是添加实例的属性和类的属性

 klass.fn = klass.prototype;
        klass.fn.parent = klass;
        //add class property
        klass.extend = function(obj){
            var extended = obj.extended;
            for(var i in obj){
                klass[i] = obj[i];
            }
            if(extended) extended(klass);
        };
        //add prototype property
        klass.include = function(obj){
            var included = obj.included;
            for(var i in obj){
                klass.fn[i] = obj[i];
            }
            if(included) included(klass);
        };
原文地址:https://www.cnblogs.com/lihaozhou/p/3965113.html