/** * 1 .函数调用返回时undefinde ,执行上下文是window * 2. new 构造,执行上下文从全局对象变成一个空的上下文,这个上下文代表新生的实列 * 因此this关键字指向当前的实例 * * 3. 默认情况下,构造函数没有返回,默认返回this,否则返回任意非原始的类型值 * * **/ //兼容bind方法 if (!Function.prototype.bind) { Function.prototype.bind = function (obj) { var slice = [].slice, args = slice.call(arguments, 1), self = this, nop = function () { }, bound = function () { return self.apply(this instanceof nop ? this : (obj || {})), args.concat(slice.call(arguments)); }; nop.prototype = self.prototype; bound.prototype = new nop(); return bound; } } var Class = function (parent) { var klass = function () { this.init.apply(this, arguments); } if (parent) { /** * 所有的子类都共享了同一个原型 * 避免在继承类的时候创建实例,只有实例的属性才会被继承 * 而非类的属性,设置对象的__proto__ * **/ var ctor = function () { }; ctor.prototype = parent.prototype; klass.prototype = new ctor; } klass.prototype.init = function () { } //prototype别名 klass.fn = klass.prototype; //定义类的别名 klass.fn.parent = klass; //保持父类引用 klass.__super__ = klass.__proto__; //保持作用域 klass.fn.proxy = klass.proxy = function (func) { var self = this; return (function () { return func.apply(self, arguments); }); } //给类添加属性 klass.extend = function (obj) { var extended = obj.extended; for (var i in obj) { klass[i] = obj[i]; } if (extended) extended(klass); } //给实列添加属性 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 Animal = new Class; Animal.include({ breath:function () { console.log("breath") } }) var Cat = new Class(Animal) var tommy = new Cat; console.log(Animal)