The use and difference of class modifiers
public, private, protected, static, abstract
public: can be inherited and instantiated
class Person { public name: string; constructor(thename: string) { this.name = thename; } } class Jack extends Person { age: number; constructor(name: string, age: number) { super(name) this.age = age; } say() { console.log(`my name is ${this.name}, age ${this.age}`); } } let p1 = new Person('tom'); console.log(p1.name); // tom let j1 = new Jack('jacker', 10); j1.say(); // my name is jacker age 10
?Private private properties can only be accessed in the base class, not in instances or derived classes
class Person { private name: string; constructor(thename: string) { this.name = thename; } sayname() { console.log(`my name is ${this.name}`); } } class Jack extends Person { age: number; constructor(name: string, age: number) { super(name) this.age = age; } say() { // Can only be accessed in Person // console.log(`my name is ${this.name}, age ${this.age}`); // error } } let p1 = new Person('tom'); p1.sayname(); // tom // console.log(p1.name); // tom // error can only be accessed in Person let j1 = new Jack('jacker', 10); j1.sayname(); // jacker
protected is protected, can be inherited, and can be accessed in derived classes. Neither subclasses nor parent classes can access instances
class Person { protected name: string; constructor(thename: string) { this.name = thename; } sayname() { console.log(`my name is ${this.name}`); } } class Jack extends Person { constructor(name: string) { super(name) } say() { // Can only be accessed in Person console.log(`my name is ${this.name}`); } } let p1 = new Person('tom'); p1.sayname(); // tom console.log(p1.name); // tom // error can only be accessed in Person and subclasses let j1 = new Jack('jacker'); j1.say(); // jacker console.log(j1.name); // error can only be accessed in Person and subclasses
// static can only be accessed through base classes and subclasses, not instances
class Person { static myName: string; constructor(name: string) { Person.myName = name; } sayname() { return Person.myName; } } class Jack extends Person { constructor() { super('jacker'); } } let p1 = new Person('tom'); p1.myName; // error myName attribute does not exist on Person console.log(p1.sayname());// tom //Access outside the class console.log(Person.myName); // tom let j1 = new Jack(); // Subclass instance accesses base class method console.log(j1.sayname()); // jacker j1.myName // error Jack attribute does not exist on myName // Subclass access static properties console.log(Jack.myName); // jacker
// abstract Abstract methods in abstract classes do not contain concrete implementations and must be implemented in derived classes
abstract class Person { sayname() { console.log('my name is sayname'); } //Abstract methods are not implemented concretely abstract say(): void; } class Jack extends Person { // Subclasses must implement the abstract methods of the parent class say() { console.log('my name is jacker'); } } // let p1 = new Person(); // Abstract classes cannot be instantiated let j1 = new Jack(); j1.sayname(); j1.say()
The use and difference of class modifiers
public, private, protected, static, abstract
public: can be inherited and instantiated
-
// public can be inherited and instantiated
-
class Person {
-
public name: string;
-
constructor(thename: string) {
-
this.name = thename;
-
}
-
}
-
class Jack extends Person {
-
age: number;
-
constructor(name: string, age: number) {
-
super(name)
-
this.age = age;
-
}
-
say() {
-
console.log(
`my name is ${this.name}, age ${this.age}`); -
}
-
}
-
let p1 =
new Person(
‘tom’); -
console.log(p1.name);
// tom -
let j1 =
new Jack(
‘jacker’,
10); -
j1.say();
// my name is jacker age 10
Private private properties can only be accessed in base classes, not instances or derived classes.
-
class Person {
-
private name: string;
-
constructor(thename: string) {
-
this.name = thename;
-
}
-
sayname() {
-
console.log(
`my name is ${this.name}`); -
}
-
}
-
class Jack extends Person {
-
age: number;
-
constructor(name: string, age: number) {
-
super(name)
-
this.age = age;
-
}
-
say() {
-
// Can only be accessed in Person
-
// console.log(`my name is ${this.name}, age ${this.age}`); // error
-
}
-
}
-
let p1 =
new Person(
‘tom’); -
p1.sayname();
// tom -
// console.log(p1.name); // tom // error can only be accessed in Person
-
let j1 =
new Jack(
‘jacker’,
10); -
j1.sayname();
// jacker
protected is protected, can be inherited, and can be accessed in derived classes. Neither subclasses nor parent classes can access instances.
-
class Person {
-
protected name: string;
-
constructor(thename: string) {
-
this.name = thename;
-
}
-
sayname() {
-
console.log(
`my name is ${this.name}`); -
}
-
}
-
class Jack extends Person {
-
constructor(name: string) {
-
super(name)
-
}
-
say() {
-
// Can only be accessed in Person
-
console.log(
`my name is ${this.name}`); -
}
-
}
-
let p1 =
new Person(
‘tom’); -
p1.sayname();
// tom -
console.log(p1.name);
// tom // error can only be accessed in Person and subclasses -
let j1 =
new Jack(
‘jacker’); -
j1.say();
// jacker -
console.log(j1.name);
// error can only be accessed in Person and subclasses
// static can only be accessed through base classes and subclasses, instances cannot be accessed
-
class Person {
-
static myName: string;
-
constructor(name: string) {
-
Person.myName = name;
-
}
-
sayname() {
-
return Person.myName;
-
}
-
}
-
class Jack extends Person {
-
constructor() {
-
super(
‘jacker’); -
}
-
}
-
let p1 =
new Person(
‘tom’); -
p1.myName;
// error myName attribute does not exist on Person -
console.log(p1.sayname());
// tom -
//Access outside the class
-
console.log(Person.myName);
// tom -
let j1 =
new Jack(); -
// Subclass instance accesses base class method
-
console.log(j1.sayname());
// jacker -
j1.myName
// myName attribute does not exist on error Jack -
// Subclass access static properties
-
console.log(Jack.myName);
// jacker
// abstract Abstract methods in abstract classes do not contain concrete implementations and must be implemented in derived classes
-
abstract
class Person { -
sayname() {
-
console.log(
‘my name is sayname’); -
}
-
//Abstract methods are not implemented concretely
-
abstract say():
void; -
}
-
class Jack extends Person {
-
// Subclasses must implement the abstract methods of the parent class
-
say() {
-
console.log(
‘my name is jacker’); -
}
-
}
-
// let p1 = new Person(); // Abstract classes cannot be instantiated
-
let j1 =
new Jack(); -
j1.sayname();
-
j1.say();