From 7926fe69e7a5659c62b7d8827760dd2a253d46c6 Mon Sep 17 00:00:00 2001 From: Krasimir Tsonev Date: Wed, 5 Feb 2014 23:10:19 +0200 Subject: [PATCH 1/3] Fixing Extending in Models Base --- app/models/Base.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/Base.js b/app/models/Base.js index 1a0bd55..5a6d090 100755 --- a/app/models/Base.js +++ b/app/models/Base.js @@ -3,8 +3,8 @@ module.exports = function(db) { }; module.exports.prototype = { extend: function(properties) { - var Child = module.exports; - Child.prototype = module.exports.prototype; + var Child = function() { }; + Child.prototype = new module.exports(this.db); for(var key in properties) { Child.prototype[key] = properties[key]; } From f9333ddc05be0862323ca193a628676ea9d16dea Mon Sep 17 00:00:00 2001 From: Krasimir Tsonev Date: Fri, 4 Apr 2014 11:45:58 +0300 Subject: [PATCH 2/3] Fixing the prototype extending --- app/models/Base.js | 6 ++++-- app/tests/base.model.spec.js | 16 +++++++++++++++- app/tests/base.view.spec.js | 14 ++++++++++++++ app/views/Base.js | 7 +++++-- 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/app/models/Base.js b/app/models/Base.js index 1a0bd55..ef85a46 100755 --- a/app/models/Base.js +++ b/app/models/Base.js @@ -3,8 +3,10 @@ module.exports = function(db) { }; module.exports.prototype = { extend: function(properties) { - var Child = module.exports; - Child.prototype = module.exports.prototype; + var Child = function(db) { + this.db = db; + }; + Child.prototype = new module.exports(); for(var key in properties) { Child.prototype[key] = properties[key]; } diff --git a/app/tests/base.model.spec.js b/app/tests/base.model.spec.js index 251abe8..73a77c4 100755 --- a/app/tests/base.model.spec.js +++ b/app/tests/base.model.spec.js @@ -16,5 +16,19 @@ describe("Models", function() { expect(model2.db).toBeDefined(); expect(model2.myCustomModelMethod).toBeDefined(); next(); - }) + }); + it("should not modify the base prototype chain", function(next) { + var model = new Model(dbMockup); + var A = model.extend({ + prop: 20 + }); + var B = model.extend({ + prop: 30 + }); + var a = new A(); + var b = new B(); + expect(a.prop).toBe(20); + expect(b.prop).toBe(30); + next(); + }); }); \ No newline at end of file diff --git a/app/tests/base.view.spec.js b/app/tests/base.view.spec.js index 733094c..1e4659d 100755 --- a/app/tests/base.view.spec.js +++ b/app/tests/base.view.spec.js @@ -25,4 +25,18 @@ describe("Base view", function() { expect(otherViewInstance.render).toBeDefined(); otherViewInstance.render({prop: 'yes'}); }); + it("should not modify the base prototype chain", function(next) { + var v = new View(); + var A = v.extend({ + prop: 20 + }); + var B = v.extend({ + prop: 30 + }); + var a = new A(); + var b = new B(); + expect(a.prop).toBe(20); + expect(b.prop).toBe(30); + next(); + }); }); \ No newline at end of file diff --git a/app/views/Base.js b/app/views/Base.js index 41da977..e8249f5 100755 --- a/app/views/Base.js +++ b/app/views/Base.js @@ -4,8 +4,11 @@ module.exports = function(response, template) { }; module.exports.prototype = { extend: function(properties) { - var Child = module.exports; - Child.prototype = module.exports.prototype; + var Child = function(response, template) { + this.response = response; + this.template = template; + }; + Child.prototype = new module.exports(); for(var key in properties) { Child.prototype[key] = properties[key]; } From b4b59615a416d66205124c81a164ce0bf6cbdf42 Mon Sep 17 00:00:00 2001 From: Krasimir Tsonev Date: Fri, 4 Apr 2014 12:01:02 +0300 Subject: [PATCH 3/3] Using util module for inheritance --- app/models/Base.js | 3 ++- app/tests/base.model.spec.js | 1 + app/views/Base.js | 3 ++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/models/Base.js b/app/models/Base.js index ef85a46..dd2722b 100755 --- a/app/models/Base.js +++ b/app/models/Base.js @@ -1,3 +1,4 @@ +var util = require('util'); module.exports = function(db) { this.db = db; }; @@ -6,7 +7,7 @@ module.exports.prototype = { var Child = function(db) { this.db = db; }; - Child.prototype = new module.exports(); + util.inherits(Child, module.exports); for(var key in properties) { Child.prototype[key] = properties[key]; } diff --git a/app/tests/base.model.spec.js b/app/tests/base.model.spec.js index 73a77c4..2a7d105 100755 --- a/app/tests/base.model.spec.js +++ b/app/tests/base.model.spec.js @@ -14,6 +14,7 @@ describe("Models", function() { }); var model2 = new OtherTypeOfModel(dbMockup); expect(model2.db).toBeDefined(); + expect(model2.setDB).toBeDefined(); expect(model2.myCustomModelMethod).toBeDefined(); next(); }); diff --git a/app/views/Base.js b/app/views/Base.js index e8249f5..1968623 100755 --- a/app/views/Base.js +++ b/app/views/Base.js @@ -1,3 +1,4 @@ +var util = require('util'); module.exports = function(response, template) { this.response = response; this.template = template; @@ -8,7 +9,7 @@ module.exports.prototype = { this.response = response; this.template = template; }; - Child.prototype = new module.exports(); + util.inherits(Child, module.exports); for(var key in properties) { Child.prototype[key] = properties[key]; }