I don't think your plunkr is related to a problem displaying prototypical objects, but more about displaying $location particularly.
After some debugging, it turns out that angular internally calls
angular.toJson($location)
And that call returns an empty object instead of the stringified version of the object. If you use JSON.stringify (which is used internally by angular, but with a replacer function that ignores variable names that start with '$' )
I modified your plunkr to manually stringify $location instead of calling angular.toJson.
Here's the modified plunkr: http://plnkr.co/edit/RszniTwU251lcXvJ3cFT?p=preview
Note how I added the following line in the controller:
$scope.stringifiedLocation = JSON.stringify($location);
And this line in the view:
<p>Stringified version ($scope.stringifiedLocation): {{stringifiedLocation}}</p>
Which produces the following output:
Stringified version ($scope.stringifiedLocation):
{"$$protocol":"http","$$host":"run.plnkr.co","$$port":80,"$$path":"","$$search":{},"$$hash":"","$$url":"","$$absUrl":"http://run.plnkr.co/8NE1mySlQzBI1dLz/","$$state":null}
I also added a prototype object to try to answer the original question. JSON.stringify does not preserve any of the prototype properties of the object. More info in this SO question
EDIT to address your 2nd edit
It looks like objects such as Geolocation and File (and many others), cannot properly be stringified even with flattening. Here's some background as to why, taken from here:
File (and many others) are what used to be called host objects, parts of the platform mainly implemented in C++ --- they have JS bindings automatically generated from IDL files, like this https://github.com/WebKit/webkit/blob/master/Source/WebCore/fileapi/File.idl
Those properties are defined as accessors, and they'll try to invoke
the accessors implemented in C++ --- the problem is that
Object.create(File.prototype) isn't going to construct the C++ backend
for this class, thus we don't really have these accessors, thus JSC
decides to throw here (see
https://github.com/WebKit/webkit/blob/master/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm#L2206-L2211
--- if it can't cast to the host object, it's gonna throw.