在JavaScript中实现继承的方法

本文详细介绍了JavaScript中实现继承的四种主要方法:原型链、call/apply方法、混合使用prototype和call/apply以及对象冒充。通过具体实例展示了每种继承方式的实现过程。

1.原型链(prototype chaining)
2.call()/apply()
3.混合方式(prototype和call()/apply()结合)
4.对象冒充

1. 原型链(prototype chaining)

function teacher(name){
    this.name = name;
}
teacher.prototype.sayName = function(){
    console.log("name is " + this.name);
}
var teacher1 = new teacher("leilei");
teacher1.sayName();

function student(name){
    this.name = name;
}
student.prototype = new teacher();
var student1 = new student("xiaolei");
student1.sayName();
//name is leilei
//name is xiaolei

2. call()/apply()方法

function teacher(name, age){
    this.name = name;
    this.age = age;
    this.sayHi = function(){
        alert("name: " + this.name + ", age: " + this.age);
    }
}
function student(){
    var args = arguments;
    teacher.apply(this, arguments);
    //teacher.call(this, args[0], args[1]);
}
var teacher1 = new teacher('leilei',21);
teacher1.sayHi();
var student1 = new student('xiaolei', 22);
student1.sayHi();

3. 混合方法prototype+call/apply

function teacher(name, age){
    this.name = name;
    this.age = age;
}
teacher.prototype.sayHello = function(){
    alert("name: " + this.name + ", age: " + this.age);
}
function student(){
    var args = arguments;
    teacher.call(this, args[0], args[1]);
}
student.prototype = new teacher();
var student1 = new student("xiaolei", 22);
student1.sayHello();

4. 对象冒充

function teacher(name, age){
    this.name = name;
    this.age = age;
    this.showInfo = function(){
        alert("name: " + this.name + ", age: " +this.age);
    }
}
function student(name, age){
    this.student = teacher;
    this.student(name, age);
    delete this.student;
}
var student1 = new student("xiaolei", 22);
student1.showInfo();
JavaScript 中,实现继承方法有以下几种方式: 1. 原型继承:利用原型链实现继承。通过将父类的实例作为子类的原型,子类就可以访问到父类的属性和方法。例如: ```javascript function Parent() { this.name = 'parent'; } Parent.prototype.sayName = function() { console.log(this.name); } function Child() {} Child.prototype = new Parent(); var child = new Child(); child.sayName(); // 输出:parent ``` 2. 构造函数继承:利用 call 或 apply 方法将父类构造函数的作用域赋给子类。这种方式可以实现继承。例如: ```javascript function Parent(name) { this.name = name; } function Child(name) { Parent.call(this, name); } var child = new Child('child'); console.log(child.name); // 输出:child ``` 3. 组合继承:结合原型继承和构造函数继承,既可以继承父类的属性和方法,又可以实现子类实例的独立。例如: ```javascript function Parent(name) { this.name = name; } Parent.prototype.sayName = function() { console.log(this.name); } function Child(name, age) { Parent.call(this, name); this.age = age; } Child.prototype = new Parent(); Child.prototype.constructor = Child; var child = new Child('child', 18); console.log(child.name); // 输出:child console.log(child.age); // 输出:18 child.sayName(); // 输出:child ``` 4. 原型式继承:利用 Object.create() 方法创建一个新对象,以某个对象为原型,然后再对新对象进行修改。例如: ```javascript var parent = { name: 'parent', sayName: function() { console.log(this.name); } }; var child = Object.create(parent, { name: { value: 'child' } }); child.sayName(); // 输出:child ``` 5. 寄生式继承:与原型式继承类似,但是在增强对象的方法时使用了一个函数封装。例如: ```javascript var parent = { name: 'parent', sayName: function() { console.log(this.name); } }; function createChild(original) { var child = Object.create(original); child.sayName = function() { console.log('hello, ' + this.name); } return child; } var child = createChild(parent); child.sayName(); // 输出:hello, parent ``` 需要注意的是,在实现继承时应该注意避免出现属性和方法的重复定义,以及避免在父类的原型上修改引用类型的属性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值