【复习】javascript es6之前的继承(组合继承)

es6之前没有提供extends关键字用于类的继承,但是可以通过构造函数+原型对象模拟实现继承,被称为组合继承

组合继承分为两步:

  • 一是属性的继承,在构造函数中添加改变this指向的call()方法让父类的this指向子类
  • 二是方法的继承,将父类的实例赋值给子类的的原型对象(prototype),再将子类原型对象上的构造器(constructor)指回子类

属性继承示例

  Father.call(this,...)  在子类构造器中使用,使得父类的this指向子类

        // 属性继承:
		// 在子类调用父类函数,用call改变this指向
		function Father (uname, age) {
			this.uname = uname;
			this.age = age;
		}
		var o = new Father('张三丰', 22);
		//console.log(o);

		// 继承
		function Son (uname, age, score) {
			// this指向不同
			// Father(uname, age);
			// 如果调用Father函数,并且能够把Father里面的this指向儿子的实例对象
			Father.call(this, uname, age);
			this.score = score;
		}
		var obj = new Son('儿子', 19, 66);
		console.log(obj);

  方法继承示例

  将父类的实例赋值给子类的原型对象,这时候父类的实例开辟了新的内存空间,使得继承不会影响原来的父类原型对象,且父类实例拥有父类的方法,赋值过去后,子类拥有了父类的方法,实现继承后,需要将子类原型对象上的构造器(constructor)指回子类

        // 方法继承
		function Father () {}
		Father.prototype.say = function () {
			console.log('say方法');
		}

		// 继承
		function Son () {}
		// 如果继承下来父类的方法啦,那么要再子类的原型对象
		// 父实例对象赋值给子原型对象,指回构造函数本身
		Son.prototype = new Father();
		// Son.prototype.chi = function () {
		// 	console.log('吃饭');
		// }
        //子类原型对象上的构造器指回子类
		Son.prototype.constructor = Son;

		console.log( Son.prototype );
		//console.log( Father.prototype );
		
		
		var obj = new Son();
		//obj.say();
		//obj.chi();
		// console.log( obj );

猜你喜欢

转载自blog.csdn.net/THcoding_Cat/article/details/107071216
今日推荐