JS 继承的几种方法总结

发布于 2024-07-13 02:08:44 字数 4184 浏览 14 评论 0

由于 js 不像 java 那样是真正面向对象的语言,js 是基于对象的,它没有类的概念

所以,要想实现继承,可以用 js 的原型 prototype 机制或者用 apply 和 call 方法去实现。在面向对象的语言中,我们使用类来创建一个自定义对象。然而 js 中所有事物都是对象,那么用什么办法来创建自定义对象呢?

这就需要用到 js 的原型:我们可以简单的把 prototype 看做是一个模版,新创建的自定义对象都是这个模版(prototype)的一个拷贝 (实际上不是拷贝而是链接,只不过这种链接是不可见,新实例化的对象内部有一个看不见的 Proto 指针,指向原型对象)。

1、对象冒充


blogfunction Parent(username){
this.username = username;
this.hello = function(){
console.log('hello ' + this.username);
}
}
Parent.prototype.sayMorning = function(){
console.log('good morning ' + this.username);
}
function Child(username,password){
//通过以下 3 行实现将 Parent 的属性和方法追加到 Child 中,从而实现继承
//第一步:this.method 是作为一个临时的属性,并且指向 Parent 所指向的对象,
//第二步:执行 this.method 方法,即执行 Parent 所指向的对象函数
//第三步:销毁 this.method 属性,即此时 Child 就已经拥有了 Parent 的所有属性和方法
this.method = Parent;
this.method(username);//最关键的一行
delete this.method;

this.password = password;
this.world = function(){
console.log(this.password);
}
}

var parent = new Parent("zhangsan");
var child = new Child("lisi","123456");
parent.hello();
parent.sayMorning();
child.hello();
child.world();

2、call() 方法方式


function Parent(username){
this.username = username;
this.hello = function(){
console.log(this.username);
}
}

Parent.prototype.sayMorning = function(){
console.log('good morning ' + this.username);
}

function Child(username,password){
Parent.call(this,username);

this.password = password;
this.world = function(){
console.log(this.password);
}
}


var parent = new Parent("zhangsan");
var child = new Child("lisi","123456");
parent.hello();
parent.sayMorning();
child.hello();
child.world();
// child.sayMorning(); 通过 prototype 添加的方法和属性,不能用来继承

3、apply() 方法方式


function Parent(username){
this.username = username;
this.hello = function(){
console.log(this.username);
}
}

Parent.prototype.sayMorning = function(){
console.log('good morning ' + this.username);
}

function Child(username,password){
Parent.apply(this,new Array(username));

this.password = password;
this.world = function(){
console.log(this.password);
}
}
var parent = new Parent("zhangsan");
var child = new Child("lisi","123456");
parent.hello();
parent.sayMorning();
child.hello();
child.world();
// child.sayMorning(); 通过 prototype 添加的方法和属性,不能用来继承

4、原型链方式

即子类通过 prototype 将所有在父类中通过 prototype 追加的属性和方法都追加到 Child,从而实现了继承


function Person(){
}
Person.prototype.hello = "hello";
Person.prototype.sayHello = function(){
console.log(this.hello);
}

function Child(){
}
Child.prototype = new Person();//这行的作用是:将 Parent 中将所有通过 prototype 追加的属性和方法都追加到 Child,从而实现了继承
Child.prototype.world = "world";
Child.prototype.sayWorld = function(){
console.log(this.world);
}

var c = new Child();
c.sayHello();
c.sayWorld();
通过 prototype 添加的方法和属性,不能用来继承

5、混合方式

混合了 call 或者 apply 方式、原型链方式


function Parent(hello){
this.hello = hello;
}
Parent.prototype.sayHello = function(){
console.log(this.hello);
}

function Child(hello,world){
Parent.call(this,hello);//将父类的属性继承过来
this.world = world;//新增一些属性
}

Child.prototype = new Parent();//将父类的方法继承过来

Child.prototype.sayWorld = function(){//新增一些方法
console.log(this.world);
}

var c = new Child("zhangsan","lisi");
c.sayHello();
c.sayWorld();
可以继承通过 prototype 添加的方法和属性

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

筱果果

暂无简介

0 文章
0 评论
390 人气
更多

推荐作者

我们的影子

文章 0 评论 0

素年丶

文章 0 评论 0

南笙

文章 0 评论 0

18215568913

文章 0 评论 0

qq_xk7Ean

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文