javaScript中的自定义类型和继承

在此只记录ECMAScript中广泛使用的认同度最高的创建自定义类型方式:组合使用构造函数模式和原型模式;

和通用的继承方式:组合继承(借用构造函数继承和原型继承的组合);

1、创建自定义类型:
             构造函数模式用于定义实例属性,原型模式用于定义共享属性和方法,
    结构就是每个实例都有自己的一份实例属性的副本又共享着对方法的引用,最大限度的节省了内存空间。
    另外此模式还支持向构造函数传递参数。

function Person(name,age,sex){
		this.name = name;
		this.age = age;
		this.sex = sex;
		this.color = [red,black];
	}
	constractor.prototype.showName = function(){
		console.log(this.name);
	}
	var person1 = new Person("Nicholas", 29, "男");
	var person2 = new Person("Greg", 27, "女");
	person1.color.push("yellow");
	alert(person1.color); //"red,black,yellow"
	alert(person2.color); //"red,black"
	alert(person1.color === person2.color); //false
	alert(person1.showName === person2.showName); //true
           在这个例子中,实例属性都是在构造函数中定义的,而由所有实例共享的方
法 showName()则是在原型中定义的。而修改了 person1.color(向其中添加一个新字符串),并不
会影响到 person2.color,因为它们分别引用了不同的数组。

2、组合继承
         组合继承(combination inheritance),有时候也叫做伪经典继承,指的是将原型链和借用构造函数的
技术组合到一块,从而发挥二者之长的一种继承模式。其背后的思路是使用原型链实现对原型属性和方
法的继承,而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数
复用,又能够保证每个实例都有它自己的属性。

function SuperType(name){
this.name = name;
this.colors = ["red", "blue", "green"];
}
SuperType.prototype.sayName = function(){
alert(this.name);
};
function SubType(name, age){
//继承属性
SuperType.call(this, name);
this.age = age;
}
//继承方法
SubType.prototype = new SuperType();

SubType.prototype.constructor = SubType;//constructor属性是对象内建的属性,存放在对象的prototype对象中。当对象的prototype被重新赋值后为了保证此属性的正确性,需手动修改constructor属性的值
SubType.prototype.sayAge = function(){
alert(this.age);
};
var instance1 = new SubType("Nicholas", 29);
instance1.colors.push("black");
alert(instance1.colors); //"red,blue,green,black"
instance1.sayName(); //"Nicholas";
instance1.sayAge(); //29
var instance2 = new SubType("Greg", 27);
alert(instance2.colors); //"red,blue,green"
instance2.sayName(); //"Greg";
instance2.sayAge(); //27
            在这个例子中, SuperType 构造函数定义了两个属性: name 和 colors。 SuperType 的原型定义
了一个方法 sayName()。 SubType 构造函数在调用 SuperType 构造函数时传入了 name 参数,紧接着
又定义了它自己的属性 age。然后,将 SuperType 的实例赋值给 SubType 的原型,然后又在该新原型
上定义了方法 sayAge()。这样一来,就可以让两个不同的 SubType 实例既分别拥有自己属性——包
括 colors 属性,又可以使用相同的方法了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值