JS: Running methods from the constructor and not using object again
I'm writing a small JS application and wanted to ask about some best practices. So, say I have a class called Dog
like this:
class Dog {
constructor(name) {
this.name = name;
}
bark() {
console.log(`Bark Bark - ${this.name}`);
}
sayName() {
console.log(`My name is ${this.name}`);
}
}
When I create a new object that is an instance of the Dog
class, I always need to call bark()
and sayName()
. When doing this, is it advised to call these methods from the constructor like this:
constructor(name) {
this.name = name;
this.bark();
this.sayName();
}
or is it better to call them outside after initializing the object like this:
let germanShepard = new Dog("german shepard");
germanShepard.bark();
germanShepard.sayName();
Note: I never need to use bark()
and sayName()
after doing this. It's only a one time thing.
So, what do you guys recommend? Are there any advantages for one over the other? Thanks in advance.
javascript design-patterns software-design
add a comment |
I'm writing a small JS application and wanted to ask about some best practices. So, say I have a class called Dog
like this:
class Dog {
constructor(name) {
this.name = name;
}
bark() {
console.log(`Bark Bark - ${this.name}`);
}
sayName() {
console.log(`My name is ${this.name}`);
}
}
When I create a new object that is an instance of the Dog
class, I always need to call bark()
and sayName()
. When doing this, is it advised to call these methods from the constructor like this:
constructor(name) {
this.name = name;
this.bark();
this.sayName();
}
or is it better to call them outside after initializing the object like this:
let germanShepard = new Dog("german shepard");
germanShepard.bark();
germanShepard.sayName();
Note: I never need to use bark()
and sayName()
after doing this. It's only a one time thing.
So, what do you guys recommend? Are there any advantages for one over the other? Thanks in advance.
javascript design-patterns software-design
In your case I would put those method calls into the constructor. Simply because ofless code when using your class. Of course then, you will always execute those methods when creating an instance.
– frontend_dev
Nov 20 '18 at 20:57
I think the question is on the fringe of being opinion-based, but if thebark
andsay
only happen when constructing the instance, they should be called in the constructor. In fact, it's not clear why they even need to be methods.
– Mark Meyer
Nov 20 '18 at 20:58
It's also not clear why this needs to be an object.
– Barmar
Nov 20 '18 at 21:32
add a comment |
I'm writing a small JS application and wanted to ask about some best practices. So, say I have a class called Dog
like this:
class Dog {
constructor(name) {
this.name = name;
}
bark() {
console.log(`Bark Bark - ${this.name}`);
}
sayName() {
console.log(`My name is ${this.name}`);
}
}
When I create a new object that is an instance of the Dog
class, I always need to call bark()
and sayName()
. When doing this, is it advised to call these methods from the constructor like this:
constructor(name) {
this.name = name;
this.bark();
this.sayName();
}
or is it better to call them outside after initializing the object like this:
let germanShepard = new Dog("german shepard");
germanShepard.bark();
germanShepard.sayName();
Note: I never need to use bark()
and sayName()
after doing this. It's only a one time thing.
So, what do you guys recommend? Are there any advantages for one over the other? Thanks in advance.
javascript design-patterns software-design
I'm writing a small JS application and wanted to ask about some best practices. So, say I have a class called Dog
like this:
class Dog {
constructor(name) {
this.name = name;
}
bark() {
console.log(`Bark Bark - ${this.name}`);
}
sayName() {
console.log(`My name is ${this.name}`);
}
}
When I create a new object that is an instance of the Dog
class, I always need to call bark()
and sayName()
. When doing this, is it advised to call these methods from the constructor like this:
constructor(name) {
this.name = name;
this.bark();
this.sayName();
}
or is it better to call them outside after initializing the object like this:
let germanShepard = new Dog("german shepard");
germanShepard.bark();
germanShepard.sayName();
Note: I never need to use bark()
and sayName()
after doing this. It's only a one time thing.
So, what do you guys recommend? Are there any advantages for one over the other? Thanks in advance.
javascript design-patterns software-design
javascript design-patterns software-design
asked Nov 20 '18 at 20:54
Yang KYang K
779
779
In your case I would put those method calls into the constructor. Simply because ofless code when using your class. Of course then, you will always execute those methods when creating an instance.
– frontend_dev
Nov 20 '18 at 20:57
I think the question is on the fringe of being opinion-based, but if thebark
andsay
only happen when constructing the instance, they should be called in the constructor. In fact, it's not clear why they even need to be methods.
– Mark Meyer
Nov 20 '18 at 20:58
It's also not clear why this needs to be an object.
– Barmar
Nov 20 '18 at 21:32
add a comment |
In your case I would put those method calls into the constructor. Simply because ofless code when using your class. Of course then, you will always execute those methods when creating an instance.
– frontend_dev
Nov 20 '18 at 20:57
I think the question is on the fringe of being opinion-based, but if thebark
andsay
only happen when constructing the instance, they should be called in the constructor. In fact, it's not clear why they even need to be methods.
– Mark Meyer
Nov 20 '18 at 20:58
It's also not clear why this needs to be an object.
– Barmar
Nov 20 '18 at 21:32
In your case I would put those method calls into the constructor. Simply because ofless code when using your class. Of course then, you will always execute those methods when creating an instance.
– frontend_dev
Nov 20 '18 at 20:57
In your case I would put those method calls into the constructor. Simply because ofless code when using your class. Of course then, you will always execute those methods when creating an instance.
– frontend_dev
Nov 20 '18 at 20:57
I think the question is on the fringe of being opinion-based, but if the
bark
and say
only happen when constructing the instance, they should be called in the constructor. In fact, it's not clear why they even need to be methods.– Mark Meyer
Nov 20 '18 at 20:58
I think the question is on the fringe of being opinion-based, but if the
bark
and say
only happen when constructing the instance, they should be called in the constructor. In fact, it's not clear why they even need to be methods.– Mark Meyer
Nov 20 '18 at 20:58
It's also not clear why this needs to be an object.
– Barmar
Nov 20 '18 at 21:32
It's also not clear why this needs to be an object.
– Barmar
Nov 20 '18 at 21:32
add a comment |
2 Answers
2
active
oldest
votes
Is it advised to call these methods from the constructor
No, don't do that. A constructor should only initialise an object, it should not do anything else. (It might use helper methods to do that). It definitely should not cause output or other side effects. Using new
calls only for running a procedure and then throwing away the object are an antipattern.
I would recommend to instead introduce a static method:
class Dog {
…
static fastLife(name) {
const dog = new this(name);
dog.bark();
dog.sayName();
// dog dies
}
}
Dog.fastLife("german shepard");
… and not using object again
Taken to the extreme, why do you need a class
at all? Why do you need an object at all when you hardly use it? Don't go for OOP when all you need is a little function.
function fastLivedDog(name) {
function bark() {
console.log(`Bark Bark - ${name}`);
}
function sayName() {
console.log(`My name is ${name}`);
}
// in this example, the local functions are called only once
// and could be trivially inlined…
bark();
sayName();
}
fastLivedDog("german shepard");
add a comment |
Want to add what Bergi wrote.
If those methods (bark and sayName) are needed handling input parameters, you definitely should use it from constructor. Simple example: you want to store in you class Dog hashed 'name', rather simple 'name'. To do that you will create method hashDogsName, that inputs a name as parameter and returns string.
function hashDogName(name) { return name.split('').reverse().join(''); }
Please, do not write such a thing, I wrote this mess to show, that function returns other string
And in your constructor you will use it:
class Dog {
constructor(name) {
this.hashedName = this.hashDogName(name);
}
}
So you need to use function in constructor, if you need to store edited object. In other situation you'll have to explain the employeer / other devs why you used functions in constructor.
I can't see any other cases why you should use class functions in constructor
(except for logs).
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53401364%2fjs-running-methods-from-the-constructor-and-not-using-object-again%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
Is it advised to call these methods from the constructor
No, don't do that. A constructor should only initialise an object, it should not do anything else. (It might use helper methods to do that). It definitely should not cause output or other side effects. Using new
calls only for running a procedure and then throwing away the object are an antipattern.
I would recommend to instead introduce a static method:
class Dog {
…
static fastLife(name) {
const dog = new this(name);
dog.bark();
dog.sayName();
// dog dies
}
}
Dog.fastLife("german shepard");
… and not using object again
Taken to the extreme, why do you need a class
at all? Why do you need an object at all when you hardly use it? Don't go for OOP when all you need is a little function.
function fastLivedDog(name) {
function bark() {
console.log(`Bark Bark - ${name}`);
}
function sayName() {
console.log(`My name is ${name}`);
}
// in this example, the local functions are called only once
// and could be trivially inlined…
bark();
sayName();
}
fastLivedDog("german shepard");
add a comment |
Is it advised to call these methods from the constructor
No, don't do that. A constructor should only initialise an object, it should not do anything else. (It might use helper methods to do that). It definitely should not cause output or other side effects. Using new
calls only for running a procedure and then throwing away the object are an antipattern.
I would recommend to instead introduce a static method:
class Dog {
…
static fastLife(name) {
const dog = new this(name);
dog.bark();
dog.sayName();
// dog dies
}
}
Dog.fastLife("german shepard");
… and not using object again
Taken to the extreme, why do you need a class
at all? Why do you need an object at all when you hardly use it? Don't go for OOP when all you need is a little function.
function fastLivedDog(name) {
function bark() {
console.log(`Bark Bark - ${name}`);
}
function sayName() {
console.log(`My name is ${name}`);
}
// in this example, the local functions are called only once
// and could be trivially inlined…
bark();
sayName();
}
fastLivedDog("german shepard");
add a comment |
Is it advised to call these methods from the constructor
No, don't do that. A constructor should only initialise an object, it should not do anything else. (It might use helper methods to do that). It definitely should not cause output or other side effects. Using new
calls only for running a procedure and then throwing away the object are an antipattern.
I would recommend to instead introduce a static method:
class Dog {
…
static fastLife(name) {
const dog = new this(name);
dog.bark();
dog.sayName();
// dog dies
}
}
Dog.fastLife("german shepard");
… and not using object again
Taken to the extreme, why do you need a class
at all? Why do you need an object at all when you hardly use it? Don't go for OOP when all you need is a little function.
function fastLivedDog(name) {
function bark() {
console.log(`Bark Bark - ${name}`);
}
function sayName() {
console.log(`My name is ${name}`);
}
// in this example, the local functions are called only once
// and could be trivially inlined…
bark();
sayName();
}
fastLivedDog("german shepard");
Is it advised to call these methods from the constructor
No, don't do that. A constructor should only initialise an object, it should not do anything else. (It might use helper methods to do that). It definitely should not cause output or other side effects. Using new
calls only for running a procedure and then throwing away the object are an antipattern.
I would recommend to instead introduce a static method:
class Dog {
…
static fastLife(name) {
const dog = new this(name);
dog.bark();
dog.sayName();
// dog dies
}
}
Dog.fastLife("german shepard");
… and not using object again
Taken to the extreme, why do you need a class
at all? Why do you need an object at all when you hardly use it? Don't go for OOP when all you need is a little function.
function fastLivedDog(name) {
function bark() {
console.log(`Bark Bark - ${name}`);
}
function sayName() {
console.log(`My name is ${name}`);
}
// in this example, the local functions are called only once
// and could be trivially inlined…
bark();
sayName();
}
fastLivedDog("german shepard");
answered Nov 20 '18 at 22:36
BergiBergi
376k61571901
376k61571901
add a comment |
add a comment |
Want to add what Bergi wrote.
If those methods (bark and sayName) are needed handling input parameters, you definitely should use it from constructor. Simple example: you want to store in you class Dog hashed 'name', rather simple 'name'. To do that you will create method hashDogsName, that inputs a name as parameter and returns string.
function hashDogName(name) { return name.split('').reverse().join(''); }
Please, do not write such a thing, I wrote this mess to show, that function returns other string
And in your constructor you will use it:
class Dog {
constructor(name) {
this.hashedName = this.hashDogName(name);
}
}
So you need to use function in constructor, if you need to store edited object. In other situation you'll have to explain the employeer / other devs why you used functions in constructor.
I can't see any other cases why you should use class functions in constructor
(except for logs).
add a comment |
Want to add what Bergi wrote.
If those methods (bark and sayName) are needed handling input parameters, you definitely should use it from constructor. Simple example: you want to store in you class Dog hashed 'name', rather simple 'name'. To do that you will create method hashDogsName, that inputs a name as parameter and returns string.
function hashDogName(name) { return name.split('').reverse().join(''); }
Please, do not write such a thing, I wrote this mess to show, that function returns other string
And in your constructor you will use it:
class Dog {
constructor(name) {
this.hashedName = this.hashDogName(name);
}
}
So you need to use function in constructor, if you need to store edited object. In other situation you'll have to explain the employeer / other devs why you used functions in constructor.
I can't see any other cases why you should use class functions in constructor
(except for logs).
add a comment |
Want to add what Bergi wrote.
If those methods (bark and sayName) are needed handling input parameters, you definitely should use it from constructor. Simple example: you want to store in you class Dog hashed 'name', rather simple 'name'. To do that you will create method hashDogsName, that inputs a name as parameter and returns string.
function hashDogName(name) { return name.split('').reverse().join(''); }
Please, do not write such a thing, I wrote this mess to show, that function returns other string
And in your constructor you will use it:
class Dog {
constructor(name) {
this.hashedName = this.hashDogName(name);
}
}
So you need to use function in constructor, if you need to store edited object. In other situation you'll have to explain the employeer / other devs why you used functions in constructor.
I can't see any other cases why you should use class functions in constructor
(except for logs).
Want to add what Bergi wrote.
If those methods (bark and sayName) are needed handling input parameters, you definitely should use it from constructor. Simple example: you want to store in you class Dog hashed 'name', rather simple 'name'. To do that you will create method hashDogsName, that inputs a name as parameter and returns string.
function hashDogName(name) { return name.split('').reverse().join(''); }
Please, do not write such a thing, I wrote this mess to show, that function returns other string
And in your constructor you will use it:
class Dog {
constructor(name) {
this.hashedName = this.hashDogName(name);
}
}
So you need to use function in constructor, if you need to store edited object. In other situation you'll have to explain the employeer / other devs why you used functions in constructor.
I can't see any other cases why you should use class functions in constructor
(except for logs).
answered Nov 20 '18 at 23:12
NikitaNikita
614
614
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53401364%2fjs-running-methods-from-the-constructor-and-not-using-object-again%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
In your case I would put those method calls into the constructor. Simply because ofless code when using your class. Of course then, you will always execute those methods when creating an instance.
– frontend_dev
Nov 20 '18 at 20:57
I think the question is on the fringe of being opinion-based, but if the
bark
andsay
only happen when constructing the instance, they should be called in the constructor. In fact, it's not clear why they even need to be methods.– Mark Meyer
Nov 20 '18 at 20:58
It's also not clear why this needs to be an object.
– Barmar
Nov 20 '18 at 21:32