js模擬類的繼承

var object = {   //定義object基本類,用於實現最基礎的方法和屬性app

    isA: function(type){函數

        var self = this;this

        while(self){prototype

            if(self == type){對象

                return true;繼承

            }io

            self = self.Type;console

        };function

        return false;class

    },

    name: 'object'

}

function Class(baseClass, defineClass){ //建立類的函數,用於聲明類及繼承的關係

    function _class(){   //建立類的臨時函數殼

        this.Type = baseClass;  //給每一個類約定一個Type屬性,引用其繼承的類

        for(var member in defineClass){

            this[member] = defineClass[member];  //複製類的所有成員到當前定義的類

        }

    }

    _class.prototype = baseClass;

    return new _class();

}

function NEW(Class, param){ //建立對象的函數,用於任意類的對象建立

    function _new(){ //建立對象的臨時函數殼

        this.Type = Class; //給每一個對象約定一個Type屬性,能夠訪問到該對象所屬的類

        if(Class.create){

            Class.create.apply(this, param); //約定每一個類的構造函數都叫create

        }

    }

    _new.prototype = Class;

    return new _new();

}


var person = Class(object, {   //person類從object類繼承並添加本身的屬性和方法

    create: function(name, age){

        this.name = name;

        this.age = age;

    },

    sayName: function(){

        console.log(this.name);

    },

    sayAge: function(){

        console.log(this.age);

    }

});

var employee = Class(person, {  //employee類從person類繼承並添加本身的屬性和方法

    create: function(name, age, sex){

        person.create.call(this, name, age);

        this.sex = sex;

    },

    saySex: function(){

        console.log(this.sex);

    }

})


var man1 = NEW(person, ['ly', 12]);

var man2 = NEW(employee, ['wade', 12, '男']);

man1.sayName(); //ly

man2.sayName(); //wade

man2.saySex();  //男

console.log(person.isA(employee))  //false

console.log(employee.isA(person))  //true































    function createClass(baseClass, defineClass){

        function _createClass(){

            for(member in defineClass){

                this[member] = defineClass[member];

            }

        }

        _createClass.prototype = baseClass;

        return new _createClass();

    }

    function NEW(aClass, parame){

        function _NEW(){

            aClass.create.apply(this, parame);

        }

        _NEW.prototype = aClass;

        return new _NEW();

    }

    var animal = createClass(Object, {

        create: function(type){

            this.type = type;

        },

        whoI: function(){

            console.log(this.type);

        }

    });

    var bird = createClass(animal, {

        create: function(type, name, age){

            animal.create.call(this, type);

            this.name = name;

            this.age = age;

        },

        isFly: function(){

            console.log("I'm flying");

        },

        sayAge: function(){

            console.log(this.age);

        },

        sayName: function(){

            console.log(this.name);

        }

    })

    var bird1  =NEW(bird, ['鳥','老鷹',12]);

    console.log(bird1);

    bird1.sayName();

    bird1.sayAge();

    bird1.isFly();

    bird1.whoI();

相關文章
相關標籤/搜索