I want to create a Javascript class/object that allow me to have various method:
Model class
Model.all() » static methodModel.find() » static methodModel delete() » instance methodModel save() » instance methodModel.create() » static that returns a new Model instanceFor static method I can define them using:
Model.staticMethod(){ method }
while for instance method is better to use:
function Model(){
this.instanceMethod = function(){}
}
and then create a new instance
or using prototype?
var m = function Model(){
}
m.prototype.method() = function() {
}
Now let's say that I want to create a new class based on Model, how to inherit not only its prototypes but also its static methods?
EDIT:
to avoid confusion this is more or less what I want to create:
http://activejs.org/activerecord/index.html and http://activejs.org/activerecord/ActiveRecord/Model/index.html
where I can define a new model using something like that
var User = ActiveRecord.create({
username: '',
password: '',
post_count: 0,
profile: ''
}
then create an instance
var jessica = User.create({
username: "Jessica",
password: "rabbit"
});
use instance methods like
jessica.save();
but also class methods:
User.findByUsername('Jessica');
function Model() {}
// Methods in the instantiated object
Model.prototype = {
constructor: Model,
// Note that "delete" is a reserved word, so we need quotes
'delete': function() {},
save: function() {}
};
// Static methods
Model.all = function() {};
Model.find = function() {};
Model.create = function() {
return new Model();
// To be more generic, you can also:
return new this();
};
When you use var InheritedModel = Object.create( Model );, it also inherits the static methods.
var InheritedModel = Object.create( Model );
!!InheritedModel.all // true
However, you can't do new InheritedModel(), because it's not a function, and using Object.create( InheritedModel ) won't give you the instance methods.
If you want to instantiate the inherited class using new, you need the following:
function InheritedModel() {}
InheritedModel.prototype = Object.create( Model.prototype );
// Copy all the static methods in the InheritedModel object
Object.keys( Model ).forEach( function( key ) {
InheritedModel[ key ] = Model[ key ];
} );
Edit: after seeing your edit, here is the solution I'd recommend you:
function ActiveRecord( type, args ) {
if ( type = 'users' ) {
return new this.users();
}
}
// Static method on ActiveRecord
ActiveRecord.create = function( type, args ) {
return new ActiveRecord( type, args );
};
ActiveRecord.prototype = {
constructor: ActiveRecord,
// Instance method on ActiveRecord, you won't need it,
// but your constructor does
users: function( args ) {}
};
var Users = ActiveRecord.prototype.users;
Users.prototype = {
constructor: Users,
// Instance method on User's instance
save: function() {}
}
// Static method on User
Users.create = function() {}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With