本文分享了js对象继承的N种模式,供大家参考。
一、原型链继承
constructor: Person,name: "Oliver"
};
function People(){};
People.prototype = new Person();
People.prototype.constructor = People;
People.prototype.sayName = function(){
return this.name;
};
var ins = new People();
console.log(ins.sayName());
二、借用构造函数(伪造对象,经典继承)
1、无参数
var instance2 = new SubType();
instance1.color.pop();
console.log(instance1.color); //["red","yellow"]
console.log(instance2.color); //["red","white"]
2、有参数
var instance2 = new SubType("Troy",24);
instance2.number.pop();
console.log(instance1.name + instance1.age + instance1.number); //Oliver1821,1
console.log(instance2.name + instance2.age + instance2.number); //Troy2421,14
三、组合继承(伪经典继承)
1、无参数
SuperType.call(this);
this.number = 321;
}
SubType.prototype = new SuperType();
SubType.prototype.constructor = SubType;
SubType.prototype.sayNumber = function(){
return this.number;
};
var instance1 = new SubType();
var instance2 = new SubType();
instance2.color.pop();
console.log(instance1.color + instance1.number); //red,yellow,white321
console.log(instance2.color + instance2.number); //red,yellow321
2、有参数
this.age = age;
}
SubType.prototype = new SuperType();
SubType.prototype.constructor = SubType;
SubType.prototype.sayAge = function(){
return this.age;
};
var instance1 = new SubType("Oliver",24);
instance2.number.pop();
console.log(instance1.sayName() + instance1.sayAge() + instance1.number); //Oliver1832,1
console.log(instance2.sayName() + instance2.sayAge() + instance2.number); //Troy2432,11
三、寄生组合式继承(引用类型最理想的范式)
this.name = name;
this.number = [321,321,43];
}
SuperType.prototype.sayName = function(){
return this.name;
};
function SubType(name,name);
this.age = age;
}
inheritPrototype(SubType,SuperType);
SubType.prototype.sayAge = function(){
return this.age;
};
var instance1 = new SubType("Oliver",24);
instance2.number.pop();
console.log(instance1.sayName() + instance1.sayAge() + instance1.number); //Oliver18321,43
console.log(instance2.sayName() + instance2.sayAge() + instance2.number); //Troy24321,321
或者可以把inheritPrototype 函数写成下面这样:
四、原型式继承(用于共享引用类型的值,与寄生式类似)
1、传统版(先定义object() 函数,再继承)
name: "Oliver",number: [321,4532,1]
};
var SubType1 = object(SuperType);
var SubType2 = object(SuperType);
SubType1.name = "Troy";
SubType1.number.pop();
SubType2.name = "Alice";
SubType2.number.pop();
console.log(SubType1.name + SubType2.name + SubType1.number + SubType2.number + SuperType.name + SuperType.number); //TroyAlice321,321321,321Oliver321,321
ECMAScript 5 版(直接用Object.create(),再继承)
var SubType2 = Object.create(SuperType);
SubType1.name = "Troy";
SubType1.number.pop();
SubType2.name = "Alice";
SubType2.number.pop();
console.log(SubType1.name + SubType2.name + SubType1.number + SubType2.number + SuperType.name + SuperType.number); //TroyAlice321,321
ECMAScript 5 简写版(定义Object.create()的第二个参数,再继承)
name: {
value : "Troy"
}
});
var SubType2 = Object.create(SuperType,{
name: {
value : "Alice"
}
});
SubType1.number.pop();
SubType2.number.pop();
console.log(SubType1.name + SubType2.name + SubType1.number + SubType2.number + SuperType.name + SuperType.number); //TroyAlice321,321
寄生式继承(用于共享引用类型的值,与原型式类似)
name: "Oliver",number: [13,21,31,1]
};
var anotherPerson = createAnother(person);
anotherPerson.number.pop();
console.log(anotherPerson.sayHi() + anotherPerson.number); //Hi13,31
console.log(person.number); //13,31
以上就是本文的全部内容,希望对大家的学习有所帮助。