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); };