javaScript中的自定义类型和继承

时间:2022-08-26 16:07:38
在此只记录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 属性,又可以使用相同的方法了。