When dog.makeSound() is called, it returns 'Woof!' because: 1) The dog object has its own makeSound method that shadows the one in its prototype, 2) JavaScript first looks for properties in the object itself before checking its prototype, 3) Property shadowing occurs when an object has a property with the same name as its prototype, 4) The prototype's method is still accessible via animal.makeSound.call(dog), 5) This demonstrates JavaScript's property lookup mechanism prioritizing own properties, 6) This behavior enables flexible method overriding in prototype chains.