the lesson (eg name and numLegs are called own properties, because they are defined directly on the instance object. ) gives me the impression that hasOwnProperties returns only the properties inherited from the constructor, but that’s wrong, hu? it simply returns ALL properties currently on the object? (which in this lesson happens to be an instance of a contstructor)
function Bird(name) {
this.name = name;
this.numLegs = 2;
}
let canary = new Bird("Tweety");
canary = {...canary, nose: 'poynty'}
let ownProps = [];
for (let property in canary) {
if(canary.hasOwnProperty(property)) {
ownProps.push(property);
}
}
console.log(ownProps)
console.log(canary)
**Your browser information:**
User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36
Yeah sorry, mistyped there as well, should have said it checks that a given non-inherited property exists on a given object and returns true if so (not “returns all non-inherited properties on an object”).
It doesn’t walk up the prototype chain, that’s the main thing. As opposed to “in”, which checks up the chain (hence why you use that if...hasOwnProperty check in the for..in loop).
Edit: Note also that hasOwnProperty has a replacement, hasOwn (which fixes a couple of small issues with hasOwnProperty), which works the same way
if (canary.hasOwn(property)) {
ownProps.push(property);
}
Only Internet Explorer, which is now dead (completely killed for good on June 15th), and Opera Mobile, which is barely used (hasn’t had releases for any platform for 12 months).
Everything else is supported, with the caveat that if a browser is locked to a specific old version may not work (applies w/r/t some companies’ IT policies, though becoming rarer because it opens the company up to security issues, policies are often now “lock to a specific browser that is kept updated”).