3.既然原型链有继承或者说代理访问的特性,那如何知道一个属性属于它本身还是在它的原型上,能不能确定在哪个原型上?
1.如何确定在实例对象上还是在原型链上
function Person() {}
Person.prototype.name = ‘小明’
const p = new Person()
p.age = 21
console.log('age' in p) // true
console.log(p.hasOwnProperty('age')) // true
console.log('name' in p) // true
console.log(p.hasOwnProperty('name')) // false
console.log('sex' in p) // false
由上述代码可知 in 操作符可以检验该对象是否有此属性,不论在什么地方,有就会返回true,没有false,hasOwnProperty属性则可以忽略该对象原型链上的属性,检验该对象自身上是否有该属性。因此:
function hasPrototypeProperty(object,name){
return !object.hasOwnProperty(name) && (name in object)
}
2.若是原型属性,如何确定在那一层原型上
class Person {
sayHi() {
return 'hello'
}
}
class Male extends Person {
saySex() {
return 'male'
}
}
const p = new Male()
console.log('sayHi' in p) // true
console.log('saySex' in p) // true
console.log(p.hasOwnProperty('sayHi')) // false
console.log(p.hasOwnProperty('saySex')) // false
//因此无法知道sayHi和saySex是在那个类的原型上
//由于原型也是一个对象,因此它也有hasOwnProperty属性,因此
console.log(p.__proto__.hasOwnProperty('saySex')) // true
console.log(p. __proto__.__proto__hasOwnProperty('sayHi')) // true
function findAttribute(object, name) {
if (!object.hasOwnProperty(name) && (name in object)) {
if (object.__proto__.hasOwnProperty(name)) {
console.log('该原型属性属于如下类\n', object.__proto__.constructor)
return
}
findAttribute(object.__proto__, name)
} else {
console.log('该属性为自身所有')
}
}
面试延伸
你知道instanceof的原理吗?
js如何实现继承,继承有哪几种方式?