prototype(显式原型)

每个函数(构造函数)都有一个prototype属性,它默认指向一个Object空对象
原型对象的constructor属性指向它本身

  1. var Person = function(){
  2. }
  3. var p = new Person;
  4. console.log(Person.prototype)

image.png

作用:给原型对象添加属性(一般是方法)

  1. var Person = function(name,age){
  2. this.name = name;
  3. this.age = age;
  4. this.see = function(){
  5. console.log(this.name+"爱看片")
  6. }
  7. }
  8. var chengchao = new Person("程超",18)
  9. chengchao.see();

这样相当于给每一个示例对象添加了see方法,非常占用内存

  1. var Person = function(name,age){
  2. this.name = name;
  3. this.age = age;
  4. }
  5. Person.prototype.see = function(){
  6. console.log(this.name+"爱看片")
  7. }
  8. var chengchao = new Person("程超",18)
  9. chengchao.see(); //程超爱看片
  10. console.log(Person.prototype)

image.png给Person的prototype中添加see。每一个Person的示例都可以调用

proto(隐式原型)

每一个示例对象都有一个proto属性
对象的隐式原型的值与其对应构造函数的显式原型的值相等,对象创建时其对应构造函数将其prototype的地址值赋给对象的proto

  1. var Person = function(name,age){
  2. this.name = name;
  3. this.age = age;
  4. }
  5. Person.prototype.see = function(){
  6. console.log(this.name+"爱看片")
  7. }
  8. var chengchao = new Person("程超",18)
  9. console.log(chengchao.__proto__ == Person.prototype)//true

原型链(隐式原型链)

作用:查找对象的属性
当我们去访问一个对象的属性时
现在自身属性中查找,
如果没有,再沿着proto这条链向上查找,找到返回,
如果任未找到,则返回undefind

  1. function Fn(){
  2. this.test1 = function(){
  3. console.log('test1()')
  4. }
  5. }
  6. Fn.prototype.test2 = function (){
  7. console.log('test2()')
  8. }
  9. var fn = new Fn();
  10. fn.test1();
  11. fn.test2();
  12. console.log(fn.toString())
  13. fn.test3();

原型链.png