copy function on a number of materials assume that they are copying from the same material type and don’t check if a field exists before trying to copy it, resulting in an error.
In this case, the Phong material tries to copy the
specular color from the Lambert material, which does not exist.
(new THREE.MeshPhongMaterial()).copy(new THREE.MeshLambertMaterial()); // Throws error on // https://github.com/mrdoob/three.js/blob/dev/src/materials/MeshPhongMaterial.js#L122
One possible fix would just be to check if a field exists before trying to call copy on it.