You are correct.
function A() {}
A.prototype.printNum = function() {};
function B() {
  this.printNum = function() {};
}
var a1 = new A();
var a2 = new A();
console.log(a1.printNum == a2.printNum); // true
var b1 = new B();
var b2 = new B();
console.log(b1.printNum == b2.printNum); // false
In the first case, there is one instance of the function implementation printNum. In the second case, each instance of B has its own function printNum.
Having many functions uses more memory and the object creation is more expensive, but prototype lookups can become a performance problem as well (according to some people, I'd still prefer them).
There is another difference: Many libraries use object.hasOwnProperty() to determine whether a property "is part of" an object. object.hasOwnProperty() returns true if the property is defined on the object itself instead of being inherited.
var a = new A();
cosole.log(a.hasOwnProperty('printNum')); // false
var b = new B();
console.log(b.hasOwnProperty('printNum')); // true
For example, JSON.stringify uses this to check which properties should be included in its output. This does not really matter as we are talking about functions (which will be ignored by JSON.stringify), but let's use this example:
function C() {}
C.prototype.myvar = "Hello world!";
function D() { this.myvar = "Hello world!"; }
var c = new C();
var d = new D();
console.log(JSON.stringify(c)); // {}
console.log(JSON.stringify(d)); // {"myvar":"Hello world!"}
Before ES5, it was pretty difficult to make variables "final" (Java) / "readonly" (C#) in JavaScript. The second approach allows to do so:
function C(finalVariable) {
  this.getMyVariable = function() { return finalVariable };
}
I do not say that this is good style or should be used in practice (it is not even safe as getMyVariable may be overwritten as well), it is just a fact: Using this function instantiation allows to access variables from the constructor without exposing them to other functions through object properties.