原型链 继承 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

猜你喜欢

转载自blog.csdn.net/qq_38674970/article/details/82934666