原型:
- 1.首先:原型是一个对象也是一个属性
- 2.函数才有一个prototype属性,里面放置公有的或者共有的属性和方法,原型里面的this指向实例的。
- 3.原型对象就是 Animal.prototype
constructor
- 原型对象有一个默认属性:constructor(构造函数属性),这个属性(是一个指针)指向 prototype 属性所在的构造函数(Animal)
proto
每个对象都有proto属性用于指向创建它的构造函数的原型对象。
function Animal(name) {//Animal构造函数
this.name = name
}
Animal.prototype.getName = function () {//Animal.prototyp原型对象
console.log(this.name)
}
Animal.prototype.getAge = function () {//Animal.prototyp原型对象
console.log(this.age)
}
var animal1 = new Animal('Kate')
var animal2 = new Animal('Lucy')
//animal1.proto == Animal.prototype//true
console.log(animal1.__proto__)//--->getName,getAge: ƒ,constructor: ƒ
//原型对象有一个默认属性:constructor指向 prototype 属性所在的构造函数
console.log(animal1.__proto__.constructor)//--->f Animal(name)构造函数
console.log(animal1.constructor)//--->f Animal(name)构造函数
//注意只有函数才有prototype属性
console.log(animal1.prototype)//undefinde
//animal1.__proto__ === Animal.prototype
console.log(animal1.__proto__.__proto__)//-->指向object的原型constructor: ƒ, __defineGetter__: ƒ...
console.log(Animal.prototype.__proto__)///-->指向object的原型constructor: ƒ, __defineGetter__: ƒ...
console.log(Object.prototype)-->指向object的原型constructor: ƒ, __defineGetter__: ƒ...
注意:
- proto和constructor属性是对象所独有的
- prototype属性是函数所独有的。但是由于JS中函数也是一种对象,所以函数也拥有proto和constructor属性
- JS 在创建对象(普通对象、函数对象)的时候,该对象都有proto 的内置属性,用于指向创建它的构造函数的原型对象。
原型链这么查找
function Abc(){
this.num=10;//属性
}
Abc.prototype={
num:100,
shownum:function(){
return this.num;
},
test:function(){
return this.num;
}
}
Object.prototype.num=1000;
var a1=new Abc();
var a2=new Abc();
//alert(a1.num);//10--100--100先后查找顺序
//alert(a1.hehe());
//alert(a1.toString());//[object Object]
实例对象----proto------->先找构造函数的原型----proto—>object下面的原型
a1----proto------->Abc.prototype----proto—>object.prototype—>NULL