I created 2 instances of a prototype, changed a function in prototype, changes reflected in both the instances (Great). However, when I modified the prototype by removing the function, the function still existed for the existing instances.
function A() {
this.name = "cool";
}
A.prototype = {
howCool: function() {
return this.name + "er";
}
};
var a1 = new A(),
a2 = new A();
a1.name = "hot";
//line1
console.log(a1.howCool());
//line2
console.log(a2.howCool());
A.prototype = {};
//line3
console.log(a1.howCool());
//line4
var a3 = new A();
console.log(a3.howCool());
Line 1 and 2 are working as expected and after setting the protoype back to empty, line 4 is showing undefined which is expected. line 3 however is still showing the function definition.
Essentially you're reassigning the prototype
property for the function A
to point to a new object. This does not affect the old object and thus doesn't affect prior instances.
Here's an illustration of what is happening.
After this code executes:
function A() {
this.name = "cool";
}
A.prototype = {
howCool: function() {
return this.name + "er";
}
};
var a1 = new A(),
a2 = new A();
the situation is the following:
Then after this code executes:
A.prototype = {};
var a3 = new A();
The A.prototype
points to a new object but the [[Prototype]] property for old instances still points to the old object.
If you want to actually remove the method, you must edit the original object, not point to a new one.
To actually remove howCool()
method from the prototype, something like this would work:
delete A.prototype.howCool
Which would give:
Now any future instances, such as a3
, and the prior ones, would all still point to the same object but that object won't have the howCool()
method.
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