原型鏈 繼承 oop
阿新 • • 發佈:2018-12-29
//原型鏈
// 原型鏈 // 物件的__proto__它的是原型,而原型也是一個物件,也有__proto__屬性,原型的__proto__又是原型的原型,就這樣可以一直通過__proto__想上找,這就是原型鏈,當向上找找到Object的原型的時候,這條原型鏈就算到頭了 var M=function(name){this.name=name;}; //prototype也是指向原型物件 //原型物件的construor指向的也是建構函式 var o3=new M("o3"); //例項_protpo_指向原型物件 // console.log(o3); //o3.__proto__===M.prototype //true 物件和函式指向相同 //M.prototype.constructor===M //true 原型物件的construor指向建構函式 var o5=new M(); o3.__proto__.say=function(){ //例項的原型上新增一個方法,這個原型的所有例項就都有了這個方法 console.log("hello world") } // o3.say(); //hello world // o5.say(); //hello world // instanceof用於判斷例項物件的_protp_和生成該例項的建構函式的prototype是不是同一個地址 //o3 instanceof M //true //o3 instanceof Object //true //判斷例項是由那個建構函式生成的 //o3.__proto__.constructor===M; //true //o3.__proto__.constructor===Object; //true
//繼承
//js繼承 //如果需要繼承 那麼就需要一個父類 function Animal(name){ this.sleep=function(){ console.log(this.name+"正在睡覺"); } } //構造繼承 Animal.prototype.eat=function(food){ //等同於上面的sleep console.log(this.name+"正在吃"+food); } // 構造繼承 複製父類的例項屬性給子類(沒用到原型) function Cat(name){ Animal.call(this); this.name = name || 'Tom'; } var cat = new Cat(); console.log(cat.name); //tom //console.log(cat.eat("fish")); //報錯 因為沒有在父元素中 console.log(cat.sleep()); //tom正在睡覺 //組合繼承呼叫父類構造,整合父類元素並且保留引數,將父類例項作為子類原型,實現函式複用 function Pig(name) { Animal.call(this); this.name = name || "pig"; } Pig.prototype = new Animal(); //獲取父類繼承 //Test Code var pig = new Pig(); console.log(pig.name); console.log(pig.sleep()); //寄生組合繼承 不會初始化兩次例項 function Dog(name){ Animal.call(this); this.name=name || "dog"; } (function(){ var Super =function(){}; Super.prototype = Animal.prototype; Dog.prototype = new Super(); })(); var dog=new Dog(); console.log(dog.name); console.log(dog.sleep());
//oop
// oop 思想 還是不咋的 學typescript再深入點吧 var Person = function () { this.head="one", this.hand="two", this.foot-"two", this.run = function () { console.log("runing"); } } var joan=new Person(); joan.run(); console.log(joan.__proto__===Person.prototype); //true var Niki = new Person(); Person.prototype.run=function(){ //與 this.run 相同 console.log("runing"); } joan.run(); //runing Niki.run(); //runing