首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JS中的继承:this.base = Class(); this.base()还是......?

在JavaScript中,继承是一种实现代码重用的方法,可以在一个类中使用另一个类的属性和方法。在这个问答内容中,我们将介绍两种常见的实现继承的方法:原型链继承和构造函数继承。

  1. 原型链继承:

原型链继承是通过将子类的原型对象指向父类的一个实例对象,从而实现继承的。具体实现如下:

代码语言:javascript
复制
function Parent() {
  this.name = 'parent';
}

Parent.prototype.sayHello = function() {
  console.log('Hello, ' + this.name);
};

function Child() {
  this.name = 'child';
}

Child.prototype = new Parent();

const child = new Child();
child.sayHello(); // 输出:Hello, child
  1. 构造函数继承:

构造函数继承是通过在子类的构造函数中调用父类的构造函数,从而实现继承的。具体实现如下:

代码语言:javascript
复制
function Parent() {
  this.name = 'parent';
}

Parent.prototype.sayHello = function() {
  console.log('Hello, ' + this.name);
};

function Child() {
  Parent.call(this); // 调用父类构造函数
  this.name = 'child';
}

const child = new Child();
child.sayHello(); // 输出:Hello, child

需要注意的是,以上两种方法都存在一定的缺陷,例如在原型链继承中,子类实例对象的属性会被所有实例共享,而构造函数继承则需要在子类构造函数中调用父类构造函数,可能会导致一些问题。因此,在实际开发中,通常会使用其他方法来实现继承,例如组合、Mixin等。

推荐的腾讯云相关产品:

  • 腾讯云云服务器:提供可靠的云计算服务,满足各种应用场景的需求。
  • 腾讯云数据库:提供多种数据库服务,包括关系型数据库、非关系型数据库等。
  • 腾讯云API网关:提供安全、稳定、高可用的API接入服务,支持API的创建、发布、监控、管理等功能。
  • 腾讯云云储存:提供可靠的云存储服务,支持对象、块、文件等存储方式。

产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

jsclass继承基础用法

在es6class可通过关键词extends来实现继承,es5则是修改原型链来实现继承。...,注意看子类fn1这个函数,他使用了父类sky属性,注意在子类使用父类属性时,只能使用this来调用,使用super是找不到,因为class属性都是实例属性。...es5继承 es5继承则是让某个构造函数原型对象等于另一个类型实例,这样实现继承。...();//使用父类方法  相信大家都可以看懂,es5继承就让子类prototype等于父类实例,即可完成继承。...相比之下,es6继承肯定更清晰,而且更方便,不过es6继承也是通过原型来操作,只是给我们封装了。 如无作者授权,请勿转载。

4.3K10
  • (必考)js关于类(class继承说法

    考核内容: Class 继承 题发散度: ★★ 试题难度: ★★ 解题思路: Class 表达式 ES6提供了更接近传统语言写法,引入了Class(类)这个概念,作为对象模板。...通过class关键字,可以定义类 与函数一样,类也可以使用表达式形式定义。 ? 上面代码使用表达式定义了一个类。...需要注意是,这个类名字是Person,但是Person只在 Class 内部可用,指代当前类。在 Class 外部,这个类只能用MyClass引用。...类内部所有定义方法,都是不可枚举(non-enumerable) 类属性名,可以采用表达式。...类构造函数,不使用new是没法调用,会报错。 Class不存在变量提升

    2.3K20

    Vue.js 九个性能优化技巧

    本文主要还是针对 Vue.js 2.x 版本,毕竟接下来一段时间,Vue.js 2.x 还是我们工作主流版本。...))) + this.base * this.base + this.base + this.base * 2 + this.base * 3 } return result...这里主要是优化前后组件计算属性 result 实现差异,优化前组件多次在计算过程访问 this.base,而优化后组件会在计算前先用局部变量 base,缓存 this.base,后面直接访问...那么为啥这个差异会造成性能上差异呢,原因是你每次访问 this.base 时候,由于 this.base 是一个响应式对象,所以会触发它 getter,进而会执行依赖收集相关逻辑代码。...数据量越大,这种优化效果就会更明显。 其实类似这种优化方式还有很多,比如我们在组件定义一些数据,也不一定都要在 data 定义。

    1.1K20

    JavaScript面试卷(二) -- 复杂创建对象模型

    如果想在JavaScript 继承属性指定初始值,需要在构造器函数添加更多代码。...下面是Engineer 构造器重新定义: function Engineer (name, projs, mach) { this.base = WorkerBee; this.base(name...可以认为,在 Engineer 构造器调用了 WorkerBee 构造器,也就为 Engineer 对象设置好了继承关系。事实并非如此。...修改所有后代某属性值 如果想在运行时修改一个对象属性值并且希望该值被所有该对象后代所继承,您就不能在该对象构造器函数定义该属性。而应该将该属性添加到该对象所关联原型。...例如: var f = new Foo(); var isTrue = (f instanceof Foo); 作为详细一点例子,假定我们使用和在 继承属性 相同一组定义。

    60420

    js class

    js class 由于存在转换器这种神器,所以代码能直接转换为es5,用es6语法写。 一些解释 jsclass仅仅为一个语法糖,是在原先构造函数基础上出现class,仅仅如此。...所以使用构造函数构造类,或者使用class语法糖构造类都是相同。具体还是使用prototype和this来进行模拟类。 重点在于构造函数,使用是构造函数来模拟类。...this.width = width; } } 在类表达式,同样会出现类声明提升问题。...extends 使用extends创建子类 class Animal { constructor(name) { this.name = name; } speak() { // 由于是在类定义...(this.name); } } let d = new Dog(); d.name = "ming" d.speak(); 类不可继承没有构造函数对象 如果一个对象没有构造函数,将不能进行继承

    11.2K10

    JSClass详解

    大家好,又见面了,我是你们朋友全栈君。 概述     在ES6class (类)作为对象模板被引入,可以通过 class 关键字定义类。...严格模式     类和模块内部,默认就是严格模式,所以不需要使用 use strict 指定运行模式 类声明 定义一个类一种方法是使用一个类声明,即用带有class关键字类名(这里是“Rectangle...toString() { console.log(this.x + ', ' + this.y) } } 注意: 在类声明方法时候,方法前不加 function 关键字...方法之间不要用逗号分隔,否则会报错 类内部所有定义方法,都是不可枚举(non-enumerable) 一个类只能拥有一个 constructor 方法 静态方法     静态方法可以通过类名调用...prototype 属性上面,在类实例上面调用方法,其实就是调用原型上方法     原型方法可以通过实例对象调用,但不能通过类名调用,会报错 class Person { constructor

    4.4K10

    深入理解JavaScript系列(29):设计模式之装饰者模式

    装饰者提供比继承更有弹性替代方案。 装饰者用用于包装同接口对象,不仅允许你向方法添加行为,而且还可以将方法设置成原始对象调用(例如装饰者构造函数)。...装饰者用于通过重载方法形式添加新功能,该模式可以在被装饰者前面或者后面加上自己行为以达到特定目的。 正文 那么装饰者模式有什么好处呢?前面说了,装饰者是一种实现继承替代方案。...当脚本运行时,在子类增加行为会影响原有类所有的实例,而装饰者却不然。取而代之是它能给不同对象各自添加新行为。...function () { decorated.performTask(); }; } function ConcreteDecoratorClass(decorated) { this.base...= AbstractDecorator; this.base(decorated); decorated.preTask = function () { console.log

    39800

    从vue-router源码中看前端路由两种实现

    一般插件对外暴露类都是定义在源码src根目录下index.js文件,打开该文件,可以看到VueRouter类定义,摘录与mode参数有关部分如下: export default class VueRouter...他们都定义在src/history文件夹下,继承自同目录下base.js文件定义History类。...,应该是在插件加载地方,即VueRouterinstall()方法混合入Vue对象,查看install.js源码,有如下一段: export function install (Vue) {...通常情况,无论是开发还是线上,前端项目都是通过服务器访问,不存在 "Opening index.html over file://" ,但程序员都知道,需求和场景永远是千奇百怪,只有你想不到,没有产品经理想不到...再看hash模式,在HashHistory: export class HashHistory extends History { constructor (router: Router, base

    1.7K30

    Vue路由实现原理

    H5History对象属性(部分) 属性 描述 length 历史记录数组长度 state 表示当前处在哪个记录上 H5History对象方法(部分) 方法 描述 back() 等效于用户点击回退按钮..._route = route }) }) } app为Vue组件实例,但是Vue作为渐进式前端框架,本身组件定义应该是没有有关路由内置属性_route,如果组件要有这个属性,应该是在插件加载地方...,即VueRouterinstall()方法混入Vue对象,install.js源码: export function install (Vue) { Vue.mixin({.../base.js'; export class HashRouter extends BaseRouter { constructor(list) { super(list);.../base.js'; export class HistoryRouter extends BaseRouter { constructor(list) { super(list);

    1.2K30

    前端测试题:(解析)js关于类(class继承说法,下面错误是?

    考核内容: Class 继承 题发散度: ★★ 试题难度: ★★ 解题思路: Class 可以通过extends关键字实现继承,这比 ES5 通过修改原型链实现继承,要清晰和方便很多。...class Father {} class Child extends Father {} 上面代码定义了一个Father类,该类通过extends关键字,继承Father类所有属性和方法。...子类必须在constructor方法调用super方法,否则新建实例时会报错。...第一种情况,super作为函数调用时,代表父类构造函数 class A {} class B extends A { constructor() { super(); } } 上面代码...class A {} class B extends A { m() { super(); // 报错 } } 第二种情况,super作为对象时,在普通方法,指向父类原型对象;在静态方法

    91920

    Js定义和继承

    new per.talk = function () { console.log("我是静态方法") } // 调用静态方法 per.talk() // 通过原型链拓展属性和方法 // 原型链上属性会被多个实例共享...Person.prototype.sex = "男" Person.prototype.work = function () { console.log(this.name + "在工作") } per.work() 类继承...对象冒充继承 // 对象冒充继承 function Woman() { //对象冒充可以继承函数属性和方法,无法继承原型链上 Person.call(this) } var wom...= new Woman() wom.run() //父类函数里方法 原型链继承 // 原型链继承 function Man() {} // 原型链可以继承函数和原型链上属性和方法 Man.prototype...= new Person() var man = new Man() man.run() //父类函数里方法 man.work() //父类原型链里方法 子类给父类传参 对象冒充+原型链 function

    2.3K40

    ES6Class回顾总结二:继承

    接昨天继续以class类作为学习对象,回顾面向对象开发有三要素。 继承,子类继承父类 封装,数据权限和保密 多态,同一接口不同实现 今天先复习下继承相关。...class可以通过extends关键字来实现子类继承父类。...方法和showScore方法,都用到了super关键字,它表示是父类构造函数,用来新建父类this对象,注意,super虽然代表了父类构造函数,但是返回是子类实例,即super内部this...子类必须在constructor方法调用super方法,否则新建实例时报错。...父类静态方法也会被子类所继承。 这里有个地方需要注意下,在子类constructor构造函数,必须先调用super方法,才能使用this,否则就会报错。

    39030

    设计模式——结构性设计模式

    (); } } 对象适配器 将需要转变类实例化,并用作与适配器类构造方法 因为类适配器会占用一个继承位,而java又是单继承。...比如我们文件夹,一个文件夹可以有很多个子文件夹或是文件。...//装饰者需要将装饰目标组合到类 protected Base base; public Decorator(Base base) { this.base = base...,在被装饰之后你能够在被增强类上使用增强后功能,增强后你还是你,只不过被强化了而已; 代理模式强调要让别人帮你去做事情,以及添加一些本身与你业务没有太多关系事情(记录日志、设置缓存等)重点在于让别人帮你做...//代理者需要将代理目标组合到类 protected Base base; public Decorator(Base base) { this.base = base

    15310
    领券