xcatliu / typescript-tutorial

TypeScript 入门教程
https://ts.xcatliu.com
10.44k stars 1.33k forks source link

#167

Open xcatliu opened 4 years ago

xcatliu commented 4 years ago

https://ts.xcatliu.com/advanced/class.html

andade1996 commented 4 years ago

真是厉害的思想,讲解的很清晰呀!

liuliudaren commented 4 years ago

private 讲错了吧 private 实例也无法使用呀 只能在原型里用 a.name是报错的 不是jack

andade1996 commented 4 years ago

我i记得我试过好像是好用的

------------------ 原始邮件 ------------------ 发件人: "liutao"<notifications@github.com>; 发送时间: 2020年8月14日(星期五) 下午5:18 收件人: "xcatliu/typescript-tutorial"; 抄送: "Comment"; 主题: Re: [xcatliu/typescript-tutorial] 类 (#167)

private 讲错了吧 private 实例也无法使用呀 只能在原型里用 a.name是报错的 不是jack

— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.

connie1992 commented 4 years ago

跟java中的类几乎是一模一样的设计呀

guojingwen commented 4 years ago

静态方法§ 使用 static 修饰符修饰的方法称为静态方法,它们不需要实例化,而是直接通过类来调用:

class Animal {
    static isAnimal(a) {
        return a instanceof Animal;
    }
}

let a = new Animal('Jack');
Animal.isAnimal(a); // true
a.isAnimal(a); // TypeError: a.isAnimal is not a function

let a = new Animal('Jack'); 到这里就报错了

Mryang119 commented 4 years ago

@guojingwen 静态方法§ 使用 static 修饰符修饰的方法称为静态方法,它们不需要实例化,而是直接通过类来调用:

class Animal {
  public name;
  public constructor(name) {
    this.name = name;
  }
}

let a = new Animal('Jack');
console.log(a.name); // Jack
a.name = 'Tom';
console.log(a.name); // Tom

let a = new Animal('Jack'); 到这里就报错了

你用的是static吗兄弟

andade1996 commented 4 years ago

好久之前看的 不是说这个不需要实例化吗

------------------ 原始邮件 ------------------ 发件人: "不会敲代码"<notifications@github.com>; 发送时间: 2020年10月4日(星期天) 晚上6:21 收件人: "xcatliu/typescript-tutorial"<typescript-tutorial@noreply.github.com>; 抄送: "孤城"<1750961007@qq.com>; "Comment"<comment@noreply.github.com>; 主题: Re: [xcatliu/typescript-tutorial] 类 (#167)

@guojingwen 静态方法§ 使用 static 修饰符修饰的方法称为静态方法,它们不需要实例化,而是直接通过类来调用: class Animal { public name; public constructor(name) { this.name = name; } } let a = new Animal('Jack'); console.log(a.name); // Jack a.name = 'Tom'; console.log(a.name); // Tom

let a = new Animal('Jack'); 到这里就报错了

你用的是static吗兄弟

— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.

Mryang119 commented 4 years ago

好久之前看的 不是说这个不需要实例化吗 你说的不能实例化的指的是抽象类abstract 啊, 你那段代码不会报错的,要报错也是因为没指定类型

guojingwen commented 4 years ago

@guojingwen 静态方法§ 使用 static 修饰符修饰的方法称为静态方法,它们不需要实例化,而是直接通过类来调用:

class Animal {
  public name;
  public constructor(name) {
    this.name = name;
  }
}

let a = new Animal('Jack');
console.log(a.name); // Jack
a.name = 'Tom';
console.log(a.name); // Tom

let a = new Animal('Jack'); 到这里就报错了

你用的是static吗兄弟

是的,代码我粘贴错了,已更正, 你再看一下

guojingwen commented 4 years ago

好久之前看的 不是说这个不需要实例化吗 ------------------ 原始邮件 ------------------ 发件人: "不会敲代码"<notifications@github.com>; 发送时间: 2020年10月4日(星期天) 晚上6:21 收件人: "xcatliu/typescript-tutorial"<typescript-tutorial@noreply.github.com>; 抄送: "孤城"<1750961007@qq.com>; "Comment"<comment@noreply.github.com>; 主题: Re: [xcatliu/typescript-tutorial] 类 (#167) @guojingwen 静态方法§ 使用 static 修饰符修饰的方法称为静态方法,它们不需要实例化,而是直接通过类来调用: class Animal { public name; public constructor(name) { this.name = name; } } let a = new Animal('Jack'); console.log(a.name); // Jack a.name = 'Tom'; console.log(a.name); // Tom let a = new Animal('Jack'); 到这里就报错了 你用的是static吗兄弟 — You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.

我知道你表达的意思是对的,但是别人拿这个demo代码跑起来有其他问题

Mryang119 commented 4 years ago

@guojingwen

@guojingwen 静态方法§ 使用 static 修饰符修饰的方法称为静态方法,它们不需要实例化,而是直接通过类来调用:

class Animal {
  public name;
  public constructor(name) {
    this.name = name;
  }
}

let a = new Animal('Jack');
console.log(a.name); // Jack
a.name = 'Tom';
console.log(a.name); // Tom

let a = new Animal('Jack'); 到这里就报错了

你用的是static吗兄弟

是的,代码我粘贴错了,已更正, 你再看一下

没看到你代码有更改,话说这评论好难评...

guojingwen commented 4 years ago

静态方法§ 使用 static 修饰符修饰的方法称为静态方法,它们不需要实例化,而是直接通过类来调用:

class Animal {
    static isAnimal(a) {
        return a instanceof Animal;
    }
}

let a = new Animal('Jack');
Animal.isAnimal(a); // true
a.isAnimal(a); // TypeError: a.isAnimal is not a function

let a = new Animal('Jack'); 到这里就报错了

@Mryang119 这里

Mryang119 commented 4 years ago

@guojingwen 静态方法§ 使用 static 修饰符修饰的方法称为静态方法,它们不需要实例化,而是直接通过类来调用:

class Animal {
    static isAnimal(a) {
        return a instanceof Animal;
    }
}

let a = new Animal('Jack');
Animal.isAnimal(a); // true
a.isAnimal(a); // TypeError: a.isAnimal is not a function

let a = new Animal('Jack'); 到这里就报错了

兄弟我看到了,我给你解释一下,你这段代码报错的原因跟静态属性这个没啥关系,你这里报错只是因为你传了一个意料外的字符串,你在类里并没有声明constructor初始函数,实例化的时候他没去用你的传入的值,所以就会报错你的代码只要改成这样就行

class Animal {
 name:string
constructor(name:string){
  this.name = name
 }
static isAnimal(a) {
    return a instanceof Animal;
 }
}
guojingwen commented 4 years ago

@guojingwen 静态方法§ 使用 static 修饰符修饰的方法称为静态方法,它们不需要实例化,而是直接通过类来调用:

class Animal {
    static isAnimal(a) {
        return a instanceof Animal;
    }
}

let a = new Animal('Jack');
Animal.isAnimal(a); // true
a.isAnimal(a); // TypeError: a.isAnimal is not a function

let a = new Animal('Jack'); 到这里就报错了

兄弟我看到了,我给你解释一下,你这段代码报错的原因跟静态属性这个没啥关系,你这里报错只是因为你传了一个意料外的字符串,你在类里并没有声明constructor初始函数,实例化的时候他没去用你的传入的值,所以就会报错你的代码只要改成这样就行

class Animal {
 name:string
constructor(name:string){
  this.name = name
 }
static isAnimal(a) {
    return a instanceof Animal;
 }
}

这个意思我明白的,影响也不大,不提了

Mryang119 commented 4 years ago

@guojingwen

@guojingwen 静态方法§ 使用 static 修饰符修饰的方法称为静态方法,它们不需要实例化,而是直接通过类来调用:

class Animal {
    static isAnimal(a) {
        return a instanceof Animal;
    }
}

let a = new Animal('Jack');
Animal.isAnimal(a); // true
a.isAnimal(a); // TypeError: a.isAnimal is not a function

let a = new Animal('Jack'); 到这里就报错了

兄弟我看到了,我给你解释一下,你这段代码报错的原因跟静态属性这个没啥关系,你这里报错只是因为你传了一个意料外的字符串,你在类里并没有声明constructor初始函数,实例化的时候他没去用你的传入的值,所以就会报错你的代码只要改成这样就行

class Animal {
 name:string
constructor(name:string){
  this.name = name
 }
static isAnimal(a) {
    return a instanceof Animal;
 }
}

这个意思我明白的,影响也不大,不提了

emmmm好吧

SharkBaby commented 3 years ago

在看这一章节的时候突然在想为什么会有static的方法,然后去搜索了哈,才明白静态方法是在创建类的时候就已经存在内存,直到程序结束才销毁,不用在每一个实例化中反复创建,节约内存空间,说的还是比较有道理

mooncoldrookie commented 3 years ago

需要注意的是,即使是抽象方法,TypeScript 的编译结果中,仍然会存在这个类,上面的代码的编译结果是:

var extends = (this && this.extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function () { this.constructor = d; } d.prototype = b === null ? Object.create(b) : ((.prototype = b.prototype), new __()); }; var Animal = (function () { function Animal(name) { this.name = name; } return Animal; })(); var Cat = (function (_super) { __extends(Cat, _super); function Cat() { _super.apply(this, arguments); } Cat.prototype.sayHi = function () { console.log('Meow, My name is ' + this.name); }; return Cat; })(Animal); var cat = new Cat('Tom');

这段没看懂。。。是底层代码吗。我编译出来的js没这么复杂

allenlinc commented 3 years ago

@connie1992 跟java中的类几乎是一模一样的设计呀

php java c# python go 我都学了 都一样 :)

CoooooLer commented 3 years ago

。。。