0

0

js中的继承知识详解

小云云

小云云

发布时间:2018-03-28 16:23:11

|

1513人浏览过

|

来源于php中文网

原创

本文我们主要和大家分享js中的继承知识详解,主要以文字和代码的形式和大家分享,希望能帮助到大家。

  1. 了解构造,实例,原型之间的关系,构造和实例的prototype指向原型,原型的constructor指向构造

  2. 子类需要重复利用父类的方法和属性

  3. 将子类构造的prototype指向父类的一个实例,子类便可以通过这个实例来访问父类的属性和方法

  4. 将此关系层层递进就形成了原型链

  • 实现

function Super(name) {
    this.name = "name";
    this.superproperty = true;
}
Super.prototype.getSuperName = function () {
    return this.name;
}
Super.prototype.getSuperproperty = function () {
    return this.superproperty;
}

function Sub(name) {
    this.name = name;
    this.subproperty = false;
}
//继承
Sub.prototype = new Super();
Sub.prototype.getSubName = function () {
    return this.name;
}
Sub.prototype.getSubproperty = function () {
    return this.subproperty;
}

var instance = new Sub("ctc");
console.log(instance.getSuperproperty());//true
console.log(instance.getSubproperty());//false
console.log(instance.getSuperName());//ctc
console.log(instance.getSubName());//ctc

最后俩输出都是ctc的过程,当instance遇到“.”操作符时会执行   1)搜索实例,2)搜索sub.prototype ,3)搜索super.prototype。

  • 注意的问题

默认原型object
每一个实例都是有默认的原型Object所以刚刚的super.prototype.prototype指向的是Object的prototype

定义的时候需要谨慎

//继承
Sub.prototype = new Super();

继承时重写?此时sub.prototype的constructor指向了谁?

此句一定要放在,

添加新方法和覆盖就方法代码之前

Sub.prototype.getSubName = function () {
    return this.name;
}
Sub.prototype.getSubproperty = function () {
    return this.subproperty;
}
  • 缺点

父类的实例属性变成了子类的原型属性被共享;

创建子类实例的时候,无法在不影响所有实例的情况下,给父类传递参数。

借用构造函数

function Super(name) {
    this.name = name;
  
}
Super.prototype.getSuperName = function () {
    return this.name;
}


function Sub(name) {
  Super.call(this,name);
this.name = name;

}//继承Sub.prototype = new Super();Sub.prototype.getSubName = function () {    return this.name;}

主要是借用了Super构造的代码,来实现sub自己的属性的定义,

但是这样写就可以让每一个实例都有自己的属性和方法,同时也就失去了方法函数的复用性

组合继承

用来解决方法复用的问题

android界面布局详解 中文WORD版
android界面布局详解 中文WORD版

本文档主要讲述的是android界面布局详解;在通过“Hello World!”介绍Android中的布局问题之前,不得不先介绍一下Android中的用户界面,因为布局问题也是用户界面问题之一。在一个Android应用程序中,用户界面通过View和ViewGroup对象构建。Android中有很多种Views和ViewGroups,他们都继承自View类。View对象是Android平台上表示用户界面的基本单元。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过

下载

在父类的构造函数中使用动态原型构造或者组合构造的方式,让构造函数中只有属性的赋值定义,方法的定义在原型上

然后在子类中,将子类的prototype指向一个父类的实例,子类的构造函数中借用父类的构造,这样子类每一个实例都有自己的属性,而方法却是共享的。

function Super(name) {
    this.name = name;
    this.superproperty = true;
}
Super.prototype.getSuperName = function () {
    return this.name;
}

function Sub(name) {
    Super.call(this,arguments);
    this.name = name;
    this.subproperty = false;
}
//继承
Sub.prototype = new Super();
// Sub.prototype.constructor = Sub;//如果此处未绑定,上一句重写了原型,Super的实例的constructor指向的自然是Super

Sub.prototype.getSubName = function () {    return this.name;}var instance = new Sub("ctc");

原型式继承

另一种继承的实现,只是借助原型可以基于已有对象创建新对象

function object(o) {
    function F() {
    }
    F.prototype = o;
    return F;
}

理解:F是一个函数也是一个对象,其原型指向了object()接受的o,返回的F是一个原型指向o的对象。

令:Object.creat()规范化了上述的函数,即Object.creat(o)同样实现了上述代码

寄生式继承

在原型式继承的基础之上,强化增强了这个对象

function creatAnother(o) {
    var clone = Object.create(o);
    clone.name = "ctc";
    clone.sayname = function () {
        console.log(this.name);
    }
    return clone;
}

为对象增加了属性方法等

寄生组合式继承

目的是为了解决组合继承的问题,在组合继承中有起码两次调用Super(),1.  Super.call(this,arguments)  2. Sub.prototype = new Super()

其实我们只是想子类的原型继承父类的方法(一般都在父类原型上,因为不会每一个实例都有自己的方法空间)

所以我们可以用原型式继承来只将子类的原型继承父类的原型

function inherit(SubType,SuperType) {
    var prototype = Object.create(SuperType);
    prototype.constructor = SubType;
    SubType.prototype = prototype;
}

将组合继承的

Sub.prototype = new Super();

换成

inherit(Sub,Super);

相关推荐:

JS中的继承方式实例详解

JS中的继承方式有哪些?

详细解读js中的继承机制

相关专题

更多
C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

10

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

29

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

21

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

21

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

13

2026.01.22

PHP特殊符号教程合集
PHP特殊符号教程合集

本专题整合了PHP特殊符号相关处理方法,阅读专题下面的文章了解更多详细内容。

11

2026.01.22

PHP探针相关教程合集
PHP探针相关教程合集

本专题整合了PHP探针相关教程,阅读专题下面的文章了解更多详细内容。

8

2026.01.22

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

55

2026.01.22

Golang 性能分析与pprof调优实战
Golang 性能分析与pprof调优实战

本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

9

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号