/**
* 该方法的功能是实现一个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
typescript
class 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
javascript
var __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]
挺方便的,也省得自己去实现读如继承之类的事情了。