1. 程式人生 > >原型鏈 繼承 oop

原型鏈 繼承 oop

//原型鏈

// 原型鏈
// 物件的__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