If I have a script on a prefab which Instantiates that same prefab (by setting the scripts 'prefabToInstantiate' variable to the same prefab that the script is on by drag-and-dropping in the editor, in case that matters), then when that scipt is called from an instance of the prefab, it doesn't create a copy of the prefab as I would expect. Rather, it creates a copy of the prefab INSTANCE from which the script was run. (and before you ask, no, my code isn't telling using the object it's attached to as the argument for Instantiate).
Here's a claryfiying example: I have a prefab called FaceCube, a cube with a face on it. It has a script, FaceCubeScript. The script has a variable, prefabToInstantiate. The script is set to instantiate prefabToInstantiate and move the new instance to a little above the object the script is attached to when the mouse is clicked on that object. In the unity editor I then drag the FaceCube prefab onto the prefabToInstantiate variable in the FaceCube prefab. Then, I create an instance of the prefab, and set its material to different one from the prefab's material. (making sure afterwards that the matertial of the prefab and the material of its instance are, indeed, different). I run the game and the click on the object, and the new FaceCube instance that's create has the material of the instance I clicked on, not the prefab's material.
So...why does that happen? This isn't actually a terribly urgent problem - it only came up in a script that I wrote to test another script. But I feel it's in my insterest to understand how the Instantiate function works as fully as I can, so any answers will be very much appreciated.