js继承:子类不会影响父类,子类可以继承父类的一些功能(代码复用)
三种方法
:
1、拷贝继承:通用型的,有new或无new的时候都可以
2、类式继承:new构造函数
3、原型继承:无new的对象
1、拷贝继承:属性与方法一般分开来继承
属性继承:调用父类的构造函数 call
方法继承:用 for in 来继承
例子:
<
script>
function Person( name, age) {
this.name = name;
this.age = age;
}
Person.prototype. showName = function () {
alert( this.name);
}
var p1 = new Person( '张三', 12);
alert( p1.name);
function Star( name, age, job) {
Person. call( this, name, age);
this.job = job;
}
//这样写时,子类改变会影响父类,如在子类上添加方法也会添加到父类上
// Star.prototype = Person.prototype;
extend( Star.prototype, Person.prototype);
Star.prototype. showJob = function () {
alert( this.job);
}
var s1 = new Star( '小明', 32, '演员');
s1. showName();
s1. showJob();
// p1.showJob();
function extend( obj1 , obj2) {
for( var attr in obj2){
obj1[attr] = obj2[attr];
}
}
</ script>
function Person( name, age) {
this.name = name;
this.age = age;
}
Person.prototype. showName = function () {
alert( this.name);
}
var p1 = new Person( '张三', 12);
alert( p1.name);
function Star( name, age, job) {
Person. call( this, name, age);
this.job = job;
}
//这样写时,子类改变会影响父类,如在子类上添加方法也会添加到父类上
// Star.prototype = Person.prototype;
extend( Star.prototype, Person.prototype);
Star.prototype. showJob = function () {
alert( this.job);
}
var s1 = new Star( '小明', 32, '演员');
s1. showName();
s1. showJob();
// p1.showJob();
function extend( obj1 , obj2) {
for( var attr in obj2){
obj1[attr] = obj2[attr];
}
}
</ script>
2、类式继承:js中没有类的结构,把js中的构造函数看作类
属性与方法一样分开来继承
例子:
<
script>
function Aaa() { //父类
this.name = '张三';
this.arrNum = [ 1, 2, 3];
}
Aaa.prototype. showName = function () {
alert( this.name);
}
function Bbb() { //子类
Aaa. call( this);
}
//加上这四句话后,子类的改变不会影响父类;此时只继承类方法;属性需要通过上面的call来继承
var Temp = function () {};
Temp.prototype = Aaa.prototype;
Bbb.prototype = new Temp();
Bbb.prototype. constructor = Bbb; //修正构造器指向问题
var b1 = new Bbb();
b1. showName();
alert( b1. constructor);
b1.arrNum. push( 4);
/**
* 如果子类不加上Aaa.call(this)
* 而且不加下面的四句话,更新b1的属性时,b2的也受影响了
* var Temp = function () {};
* Temp.prototype = Aaa.prototype;
* Bbb.prototype = new Temp();
* Bbb.prototype.constructor = Bbb; //修正指向问题
* @type {Bbb}
*/
var b2 = new Bbb();
alert( b2.arrNum);
</ script>
function Aaa() { //父类
this.name = '张三';
this.arrNum = [ 1, 2, 3];
}
Aaa.prototype. showName = function () {
alert( this.name);
}
function Bbb() { //子类
Aaa. call( this);
}
//加上这四句话后,子类的改变不会影响父类;此时只继承类方法;属性需要通过上面的call来继承
var Temp = function () {};
Temp.prototype = Aaa.prototype;
Bbb.prototype = new Temp();
Bbb.prototype. constructor = Bbb; //修正构造器指向问题
var b1 = new Bbb();
b1. showName();
alert( b1. constructor);
b1.arrNum. push( 4);
/**
* 如果子类不加上Aaa.call(this)
* 而且不加下面的四句话,更新b1的属性时,b2的也受影响了
* var Temp = function () {};
* Temp.prototype = Aaa.prototype;
* Bbb.prototype = new Temp();
* Bbb.prototype.constructor = Bbb; //修正指向问题
* @type {Bbb}
*/
var b2 = new Bbb();
alert( b2.arrNum);
</ script>
3、原型继承:
例子:
<
script>
var a = {
name : '张三'
}
var b = cloneObj( a);
b.name = 'lisi';
alert( b.name);
alert( a.name);
function cloneObj( obj) {
var Temp = function () {};
Temp.prototype = obj;
return new Temp();
}
</ script>
var a = {
name : '张三'
}
var b = cloneObj( a);
b.name = 'lisi';
alert( b.name);
alert( a.name);
function cloneObj( obj) {
var Temp = function () {};
Temp.prototype = obj;
return new Temp();
}
</ script>