每日吃透一个面试题(3)--原型链

152 阅读1分钟

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如何实现继承,继承有哪几种方式?