通过代码初步了解三者关系
// Person 是一个构造函数;(它用来构造对象,并且是个函数)
function Person(name, age) {
var gender = girl // 私有属性
this.name = name // 自有属性
this.age = age
}
// prototype 是 Person 原型对象 (它既是实例对象的原型,也是一个对象,也是构造函数的属性,即---原型属性)
// 该对象上定义的所有属性和方法都会被实例对象所继承;
Person.prototype.sayName = function() {
alert(this.name)
}
// kitty即是构造函数Person的实例对象(构造函数生成的一个实例,他是一个对象)一种是通过构造函数生成的‘自有属性’,一种是原型对象可以访问的所有属性
var kitty = new Person('kitty', 14)
kitty.sayName() // kitty
proto属性
- 为什么我们的实例对象可以访问到构造函数原型属性上的属性?
- 每个对象自身都拥有一个隐式的--proto--属性,该属性默认是一个指向其构造函数的原型属性的指针。
- 当一个对象访问一个属性时,首先会找自有属性,如果没有找到则会在--proto--属性指向的原型属性只不过继续查找,如果没有找到的话原型属性的--proto--中查找。如果没找到就会继续按照上面方式继续寻找,直到找到最顶部构造函数Object的prototype原型属性,如果还没有找到就返回undefined;----原型链
两个重要概念
- 每一个对象自身都拥有一个隐式--proto--属性,该属性默认是一个指向其构造函数原型属性的指针;
- 几乎所有函数都拥有prototype原型属性;