I completely agree. The vast majority of complaints about JS have to do with not knowing what the language is designed to do. I previously cursed JS until I spent the time to read/reread enough JS books to know what it should do. If I get unexpected behavior now, I know it's an error in my code, or I don't understand what should happen (thus time for me to read and learn).
As you pointed out, the examples yield the expected behavior.
myRide.drive();
// outputs 'BMW' b/c `this` is pointing to the instance
letsDrive = myRide.drive;
letsDrive();
// model should be undefined b/c myRide.drive is a function that is assigned to the letsDrive variable. Thus, `this` points to letsDrive, which of course does not have a `model` property.
To get letsDrive() to output a value other than undefined, we can simply create a `model` property and assign it a value.
letsDrive.model = 'Mercedes';
letsDrive();
// outputs 'Mercedes' b/c letsDrive now has a model property.
Lastly, the `delayed` method returns an anonymous function which in turn returns this.model. As JavaScript has function scope, the `this` inside the anonymous function points to the anonymous function itself. As the anonymous function does not have an attribute named `model`, undefined is returned (as expected).