javascript prototype和__proto__和继承的机制

//为什么prototype的出现?prototype 为了暴露公共的属性(从而实现继承) 私有的属性就在构造函数里面实现(变量的局部性)
function DOG(name){

    this.name = name;

  }

  DOG.prototype = { species : '犬科' };


  var dogA = new DOG('大毛');

  var dogB = new DOG('二毛');


  alert(dogA.species); // 犬科

  alert(dogB.species); // 犬科


DOG.prototype.species = '猫科';


  alert(dogA.species); // 猫科

  alert(dogB.species); // 猫科
//这样就实现了  实例dogA和实例dogB的私有属性name互不受影响 dogA和dogB共享公共属性species

  //普通对象
  let _simple={param:1};
  console.log(_simple.__proto__===Function.prototype);
  console.log(_simple.__proto__===Object.prototype);

function Foo(){};//函数对象 构造函数
var f1 = new Foo();//f1为实例对象
console.log(f1.prototype);
//undefined 实例对象没有prototype 为什么有__proto__?  
//那怎么把实例对象与函数对象关联起来 引入__proto__这个属性 指向函数对象的prototype 这样实例对象就具有函数对象portotype的方法了
console.log(f1.constructor===Foo.prototype.constructor);
//true 实例对象调用prototype上的方法====函数对象原型上的方法 由于__proto__指向Foo.prototype 实例对象自然就可以调用prototype的方法
console.log(typeof Foo);
console.log(f1.__proto__===Foo.prototype);//true
console.log(Foo.__proto__===Function.prototype);//true
console.log(Function.__proto__===Object.prototype);//true

console.log(Foo===Foo.prototype.constructor);
//Foo这个构造函数 实际上就是Foo原型上的constructor方法 Foo.prototype.constructor 就相当于Foo.prototype.constructor 直接指向Foo这个方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章