首页 > javascript封装模拟一个类继承

javascript封装模拟一个类继承

/**
 * 该方法的功能是实现一个OOP中的Class。
 * 该方法可以传入两个参数,一个是Parent Class,另外一个就是Class自身的配置。
 * 第一个参数为可选参数,在不使用此参数的时候,则类似于下面代码中的Pet的定义。
 * 如果使用了第一个参数,泽类似于下面代码中的Dog的定义。
 *
 * 如果用户定义了Parent Class,则返回的Function需要增加一个属性$super,指向Parent Class。
 *
 * @param parent 可选参数,如果第一个参数不为Function,则相当于用户未指定Parent Class。
 * @param options Class本身的配置。
 * @returns {Function} 无论如何都需要返回一个Function。
 */
var Class = function(parent, options) {
};

var Pet = Class({
    constructor: function(name, age) {
        this.name = name;
        this.age = age;
    },
    eat: function() {
        console.log('eating');
    },
    sleep: function() {
        console.log('sleeping');
    },
    toString: function() {
        return '[' + this.name + ',' + this.age + ']';
    }
});

var Dog = Class(Pet, {
    constructor: function() {
        Dog.$super.apply(this, arguments);
    },
    bark: function() {
        console.log('barking');
    }
});

var dog = new Dog('a stupid dog', 10);
console.log(dog instanceof Pet); // true
dog.eat(); // eating
dog.bark(); // barking
dog.sleep(); // sleeping

console.log(dog.toString()); // [a stupid dog,10]

写一段 TypeScript

typescriptclass Pet {
    name;
    age;

    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
    eat() {
        console.log('eating');
    }
    sleep() {
        console.log('sleeping');
    }
    toString() {
        return '[' + this.name + ',' + this.age + ']';
    }
}

class Dog extends Pet {
    constructor(name, age) {
        super(name, age);
    }
    bark() {
        console.log('barking');
    }
}

var dog = new Dog('a stupid dog', 10);
console.log(dog instanceof Pet); // true
dog.eat(); // eating
dog.bark(); // barking
dog.sleep(); // sleeping

console.log(dog.toString()); // [a stupid dog,10]

在 http://www.typescriptlang.org/Playground 把它翻译成 JavaScript

javascriptvar __extends = this.__extends || function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();
};
var Pet = (function () {
    function Pet(name, age) {
        this.name = name;
        this.age = age;
    }
    Pet.prototype.eat = function () {
        console.log('eating');
    };
    Pet.prototype.sleep = function () {
        console.log('sleeping');
    };
    Pet.prototype.toString = function () {
        return '[' + this.name + ',' + this.age + ']';
    };
    return Pet;
})();
var Dog = (function (_super) {
    __extends(Dog, _super);
    function Dog(name, age) {
        _super.call(this, name, age);
    }
    Dog.prototype.bark = function () {
        console.log('barking');
    };
    return Dog;
})(Pet);
var dog = new Dog('a stupid dog', 10);
console.log(dog instanceof Pet); // true
dog.eat(); // eating
dog.bark(); // barking
dog.sleep(); // sleeping
console.log(dog.toString()); // [a stupid dog,10]

挺方便的,也省得自己去实现读如继承之类的事情了。

【热门文章】
【热门文章】