原型对象及原型链
原型对象
我们创建的每一个函数都有一个隐含的属性prototype,这个属性对应着一个对象,即原型对象
function fun(){
}
console.log(typeof fun.prototype) //object
用处
当函数以普通函数形式调用时,prototype属性没有用处
当函数以构造函数形式调用时,它所创建的对象中都有一个隐含的属性指向该构造函数的原型对象
function Person(name) {
this.name = name
}
let per1 = new Person("Bob");
let per2 = new Person("Alice");
console.log(Person.prototype === per1.__proto__) //true
console.log(per1.__proto__ === per2.__proto__) //true
所以我们可以将同一个类的实例中的共有属性,统一设置在原型对象中
function Person(name) {
this.name = name
}
let per1 = new Person("Bob");
let per2 = new Person("Alice");
Person.prototype.a = "aaa"
Person.prototype.sayName = function(){
console.log(`Hello,${this.name}`)
}
console.log(per1.a) //"aaa"
per1.sayName() //"Hello,Bob"
console.log(per2.a) //"aaa"
per2.sayName() //"Hello,Alice"
原型链
当查找一个实例的属性时,如果这个实例中没有,就到该实例的原型中去找,如果还没有,就到该实例的原型的原型中去找,一直找到object的原型,如果object的原型还没有,就返回undefined,即:
实例——实例的原型——实例的原型的原型——Object的原型
hasOwnProperty()
通过hasOwnProperty()判断属性是否是实例本身的,而不是其原型中的