原型链:就是为了继承而存在的一个方法。它就好像在我身上没有找到特征,就去我的父亲那里找,我父亲那里没找到,就会顺着我爸爸的线索,从我爷爷那里找,依次往上找,直到找到这条线的端点;这里我们像这样找的方法的构成了一条线,有规律的依次往父辈去找,这样的找法就好比原型链一样,原型链就是通过_proto_的方法依次有规律的沿着原型对象找。在这里找的特征就好比属性,方法等,而父亲、爷爷就好比原型对象。
构造函数对象:就是对象的初始化,用来对对象的属性、变量的赋值……的一些操作;通常都是new运算符创建的;构造函数对象里面有一个属性为prototype,它指向了这个构造函数的原型对象。
原型对象:是函数对象的一个属性,里面定义了许多的方法,他可以避免内存的浪费的问题。原型对象里面有一个属性是constrotor,利用constrotor可以找到它的构造函数对象。
_proto_:每一个新建的对象里都有一个属性,就是_proto_,他就好像是寻找原型对象的指南针,所以它是指向原型对象的。
原型链的第一条链:原型对象链
新建的对象都有一个_proto_,在这个新建的对象上找不到所需要的方法和属性就会沿着图1所示的方向逐级查找。
Person.prototype:这个相当于调用了Person里的prototype属性,prototype又是指向原型对象,所以这里的Person.prototype就相当于原型对象。
<script>
//构造函数
function Person(name, age) {
this.name = name;
this.age = age;
}
//创建构造函数
var person = new Person('构造函数', 50);
//原型链之间的关系
console.log(person.__proto__ === Person.prototype);
// true person对象通过__proto__找到Person原型对象
console.log(Person.prototype.constructor === Person);
// true Person原型对象的constructor指向Person构造函数
console.log(Person.prototype.__proto__ === Object.prototype);
// true Person原型对象通过__proto__找到Object原型对象(所有的直接量对象都是有Object函数对象构造出来的)
console.log(Object.prototype.constructor === Object);
// true Object原型对象的constructor指向Object构造函数
console.log(Object.prototype.__proto__);
// null Object原型对象的指向就是null,意思如果还在Object原型对象里面找不到方法和属性,后面就找不到了。它是最后一个。
</script>
图1
原型链的第二条链:原型函数链
<script>
//构造函数
function Person(name, age) {
this.name = name;
this.age = age;
}
//创建构造函数
var person = new Person('构造函数', 50);
//原型链之间的关系
console.log(Person.__proto__ ===Function.prototype);
// true Person对象通过__proto__找到Function原型对象(所有的函数对象都是有Function函数构造的)
console.log(Function.prototype.constructor === Function);
// true Function原型对象的constructor指向Function构造函数
console.log(Function.prototype.__proto__ === Object.prototype);
// true Function原型对象通过__proto__找到Object原型对象(所有的直接量对象都是有Object函数对象构造出来的)
console.log(Object.prototype.constructor === Object);
// true Object原型对象的constructor指向Object构造函数
console.log(Object.prototype.__proto__);
// null Object原型对象的指向就是null,意思如果还在Object原型对象里面找不到方法和属性,后面就找不到了。它是最后一个。
</script>
图2
原型链的第三条链:Function函数链
<script>
//原型链之间的关系
console.log(Function.__proto__ ===Function.prototype);
// true Function函数对象通过__proto__找到Function原型对象(有Function构造函数的_proto_是指向他本身的原型对象)
console.log(Function.prototype.constructor === Function);
// true Function原型对象的constructor指向Function构造函数
console.log(Function.prototype.__proto__ === Object.prototype);
// true Function原型对象通过__proto__找到Object原型对象(所有的直接量对象都是有Object函数对象构造出来的)
console.log(Object.prototype.constructor === Object);
// true Object原型对象的constructor指向Object构造函数
console.log(Object.prototype.__proto__);
// null Object原型对象的指向就是null,意思如果还在Object原型对象里面找不到方法和属性,后面就找不到了。它是最后一个。
</script>
图3
原型链的第四条链:Object函数链
<script>
//原型链之间的关系
console.log(Object.__proto__ === Function.prototype);
// true Object函数对象通过__proto__找到Function原型对象(有Object构造函数也是有Function构造出来的)
console.log(Function.prototype.__proto__ === Object.prototype);
// true Function原型对象通过__proto__找到Object原型对象(所有的直接量对象都是有Object函数对象构造出来的)
console.log(Object.prototype.constructor === Object);
// true Object原型对象的constructor指向Object构造函数
console.log(Object.prototype.__proto__);
// null Object原型对象的指向就是null,意思如果还在Object原型对象里面找不到方法和属性,后面就找不到了。它是最后一个。
</script>
图4