菜单

一连的含义和操作

2019年4月10日 - 金沙编程资讯

输出

子类是继续父类的,不过子类也得以另行定义父类的存在的章程,那称为重写,重写体现了子类的独立性还有可变性,也号称(多态),方法重写有三个原则一:继承的涉嫌。2:父类存在的方式。3:子类重新定义

Class的静态方法

类也就是实例的原型,全数在类中定义的章程,都会被实例继承。假如在一个主意前,加上static首要字,就代表该格局不会被实例继承,而是径直通过类来调用,那就叫做“静态方法”。

class Foo {
  static classMethod() {
    return 'hello';
  }
}

Foo.classMethod() // 'hello'

var foo = new Foo();
foo.classMethod()
// TypeError: undefined is not a function

下边代码中,Foo类的classMethod方法前有static重在字,注脚该方法是三个静态方法,能够一贯在Foo类上调用(Foo.classMethod()),而不是在Foo类的实例上调用。要是在实例上调用静态方法,会抛出1个荒谬,表示不设有该办法。

父类的静态方法,能够被子类继承。

class Foo {
  static classMethod() {
    return 'hello';
  }
}

class Bar extends Foo {
}

Bar.classMethod(); // 'hello'

地点代码中,父类Foo有一个静态方法,子类Bar能够调用这几个法子。

静态方法也是足以从super目的上调用的。

class Foo {
  static classMethod() {
    return 'hello';
  }
}
Foo.classMethod() // 'hello'
var foo = new Foo();
foo.classMethod()
// TypeError: foo.classMethod is not a function

类继承:

前几日学习了面向对象的一连意义和部分操作,继承,分为父类和子类,父类的片段公共数据都得以让子类实行利用,而私有化的多寡,子类将不能够动用。Class
Person()与class Man(Person)那样正是Class Man(Person)是Class
Person的子类,父类Class
Person中的公共数据,都得以让子类实行利用,等于是将父类的数目赋值给子类,通过内部存款和储蓄器地址举办连接,继承还有多两次三番,叁个父类可以被七个子类继承,下跌了代码的重复使用,使代码越发的简要。

Object.getPrototypeOf()

Object.getPrototypeOf办法可以用来从子类上获得父类。

Object.getPrototypeOf(ColorPoint) === Point
// true

因此,能够运用那个主意判断,八个类是不是持续了另3个类。

父类的静态方法,能够被子类继承。

Parent Class(父类)
与 Child Class(子类):

2.私局地艺术,无法由此对象直接待上访问。

Class表达式

与函数壹样,Class也足以动用表达式的花样定义。

const MyClass = class Me {
  getClassName() {
    return Me.name;
  }
};

地方代码应用表明式定义了叁个类。须要小心的是,这一个类的名字是MyClass而不是MeMe只在Class的中间代码可用,指代当前类。

let inst = new MyClass();
inst.getClassName() // Me
Me.name // ReferenceError: Me is not defined

地点代码表示,Me只在Class内部有定义。

假如Class内部没用到的话,能够省略Me,也便是能够写成下面包车型客车款式。

const MyClass = class { /* ... */ };

使用Class表明式,能够写出登时执行的Class。

let person = new class {
  constructor(name) {
    this.name = name;
  }

  sayName() {
    console.log(this.name);
  }
}('张三');

person.sayName(); // "张三"

上边代码中,person是2个立刻执行的Class的实例。

上面代码中,Foo类的Symbol.iterator方法前有一个星号,表示该办法是3个Generator函数。Symbol.iterator方法重返2个Foo类的私下认可遍历器,for…of循环会自动调用这一个遍历器。

那种做法的根本利益之1正是代码重用。

连续有几点注意:

类的prototype属性和__proto__属性

大部浏览器的ES5落实之中,每2个对象都有__proto__性情,指向对应的构造函数的prototype属性。Class作为构造函数的语法糖,同时有prototype属性和__proto__性能,因而同时设有两条继承链。

(1)子类的__proto__属性,表示构造函数的持续,总是指向父类。

(2)子类prototype属性的__proto__属性,表示方法的存在延续,总是指向父类的prototype属性。

class A {
}

class B extends A {
}

B.__proto__ === A // true
B.prototype.__proto__ === A.prototype // true

地点代码中,子类B__proto__性格指向父类A,子类Bprototype属性的__proto__属性指向父类Aprototype属性。

这样的结果是因为,类的接轨是比照上边包车型客车方式落成的。

class A {
}

class B {
}

// B的实例继承A的实例
Object.setPrototypeOf(B.prototype, A.prototype);

// B继承A的静态属性
Object.setPrototypeOf(B, A);

Class之间可以通过extends关键字贯彻一连,那比ES5的经过改动原型链落成持续,要显然和便利广大。

被持续的类称为父类,继承的类称为子类,一个父类,能够有多少个子类;

后续的含义和操作

Class的继承

一、类(Class)

 

�������rz�+��

new.target属性

new是从构造函数生成实例的一声令下。ES6为new指令引进了三个new.target性子,(在构造函数中)再次回到new一声令下成效于的不胜构造函数。假使构造函数不是通过new一声令下调用的,new.target会返回undefined,因而那脾本性能够用来规定构造函数是怎么调用的。

 

正文实例讲述了ES6新特点之类(Class)和持续(Extends)相关概念与用法。分享给大家供大家参考,具体如下:

当子类与父类下方法同样时,子类会覆盖父类的措施内容;其实那便是壹种重写,也是1种多态。

自家对接轨的知晓就是,父类中的方法和质量有无数,可是子类只关注需求的主意和总体性,父类中存放的貌似都以有的公共的内容,进步代码的复用性,子类能够随时继承父类中的公共措施和内容。

类的实例对象

生成类的实例对象的写法,与ES5一心平等,也是使用new一声令下。倘诺忘记加上new,像函数那样调用Class,将会报错。

// 报错
var point = Point(2, 3);

// 正确
var point = new Point(2, 3);

与ES伍壹如既往,实例的品质除非显式定义在其本身(即定义在this对象上),不然都以概念在原型上(即定义在class上)。

与ES5一样,类的具有实例共享三个原型对象。

那也象征,能够经超过实际例的__proto__属性为Class添加办法。

var p1 = new Point(2,3);
var p2 = new Point(3,2);

p1.__proto__.printName = function () { return 'Oops' };

p1.printName() // "Oops"
p2.printName() // "Oops"

var p3 = new Point(4,2);
p3.printName() // "Oops"

地点代码在p1的原型上添加了2个printName方法,由于p1的原型就是p2的原型,因此p2也能够调用这么些情势。而且,此后新建的实例p3也能够调用那些办法。那意味,使用实例的__proto__特性改写原型,必须壹对1谨慎,不推荐使用,因为那会改变Class的本来定义,影响到拥有实例。

你恐怕感兴趣的稿子:

子类,1旦连续父类,就颇具了父类的本性与艺术,根据需求可以实行增加和删除改。

壹.私有个别属性,不能够通过对象直接待上访问,然则足以经过艺术来做客。

super关键字

super那个根本字,有两种用法,含义差别。

(1)作为函数调用时(即super(...args)),super代表父类的构造函数。

(2)作为对象调用时(即super.propsuper.method()),super表示父类。注意,此时super即能够引用父类实例的质量和办法,也得以引用父类的静态方法。

 

叁、原生构造函数继承

示范代码一:

四.形似境况下,私有的质量,方法都以不对外发表的,往往用来做内部的事情,起到安全的左右和功力

概述

JavaScript语言的历史观情势是通过构造函数,定义并生成新对象。下边是三个例证。

function Point(x,y){
  this.x = x;
  this.y = y;
}

Point.prototype.toString = function () {
  return '(' + this.x + ', ' + this.y + ')';
};

上边那种写法跟古板的面向对象语言(比如C++和Java)差距非常大,很简单让新学习那门语言的程序员感到猜忌。

ES陆提供了更就像是守旧语言的写法,引进了Class(类)那个定义,作为指标的沙盘。通过class要害字,能够定义类。基本上,ES陆的class能够当作只是四个语法糖,它的绝抢先八分之四作用,ES伍都足以做到,新的class写法只是让对象原型的写法越发清晰、更像面向对象编制程序的语法而已。上边的代码用ES陆的“类”改写,正是下边那样。

//定义类
class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }

  toString() {
    return '(' + this.x + ', ' + this.y + ')';
  }
}

地点代码定义了一个“类”,能够看来里边有1个constructor方法,那正是构造方法,而this关键字则意味实例对象。也正是说,ES伍的构造函数Point,对应ES6的Point类的构造方法。

Point类除了构造方法,还定义了二个toString措施。注意,定义“类”的点子的时候,前边不供给添加function以此根本字,直接把函数定义放进去了就足以了。此外,方法之间不要求逗号分隔,加了会报错。

构造函数的prototype质量,在ES陆的“类”上边继续存在。事实上,类的拥有办法都定义在类的prototype属性上面

class Point {
  constructor(){
    // ...
  }

  toString(){
    // ...
  }

  toValue(){
    // ...
  }
}

// 等同于

Point.prototype = {
  toString(){},
  toValue(){}
};

在类的实例上面调用方法,其实就是调用原型上的方法。

class B {}
let b = new B();

b.constructor === B.prototype.constructor // true

类的内部装有定义的点子,都是数不胜数的(non-enumerable)。

//定义类
class Point {
  constructor(x, y) {  //constructor 构造方法
    this.x = x;
    this.y = y;
  }
  toString() {
    return '(' + this.x + ', ' + this.y + ')';
  }
}
var p = new Point(1, 2);

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图