js 怎么来写一个基类

2017 年 9 月 12 日
 xiaomeimei
6524 次点击
所在节点    JavaScript
67 条回复
mooncakejs
2017 年 9 月 12 日
在 es 里接口声明比较麻烦,抽象基类还有办法,定义一个方法,实现直接 throw
mooncakejs
2017 年 9 月 12 日
上 typescript,和 c# 基本差不了多少了。
thisisgpy
2017 年 9 月 12 日
class gay {}
arzusyume
2017 年 9 月 12 日
class Base {}
class A extends Base {}
murmur
2017 年 9 月 12 日
都上了 js 还在想设计模式 你中毒了。。js 要什么设计模式。。不都是推翻重来。。还要继承。。
SuperMild
2017 年 9 月 12 日
js 本身不合适,如果不愿意享受原型链的乐趣,最好上 typescript
donlxn22
2017 年 9 月 12 日
TypeScript
lamada
2017 年 9 月 12 日
TypeScript 你值得拥有
xiaomeimei
2017 年 9 月 12 日
@mooncakejs @thisisgpy @SuperMild @donlxn22 @lamada TypeScript 写完后还要「编译」成 javascript,而且还比较麻烦
xiaomeimei
2017 年 9 月 12 日
@murmur 但有些基础的东西确实感觉可以用设计模式
murmur
2017 年 9 月 12 日
@xiaomeimei 就算是 ES6/TS 背后还是丑陋的原型链
SuperMild
2017 年 9 月 12 日
@xiaomeimei 不麻烦,比手写模拟真 OO 方便很多了。
xiaomeimei
2017 年 9 月 12 日
@murmur 是啊,背后相当丑陋。throw 的那种方法我想过了,但感觉好丑
murmur
2017 年 9 月 12 日
@xiaomeimei 那就学习 vue,用 mixin 的概念代替 extend

react 不也改成 createComponent 了么
xiaomeimei
2017 年 9 月 12 日
@SuperMild 又要我装一下编辑器了
zjsxwc
2017 年 9 月 12 日
es5 基本不会去用继承(其实语法上也实现不了), 而是和 golang 一样通过组合来实现继承的作用, 比如我想要 obj2 拥有 obj1 的 methodB 能力, 可以这么写:

```
function Class1(constructParamA, constructParamB){
this.constructParamA = constructParamA;
this.constructParamB = constructParamB;
}
Class1.prototype.methodA = function (){};
Class1.prototype.methodB = function (){
console.log(this.constructParamA+this.constructParamB);
};


function Class2(constructParamA){
this.constructParamA = constructParamA;
}
Class2.prototype.methodB = function (){
this.constructParamA.methodB();
};


var obj1 = new Class1("foo","bar");
var obj2 = new Class2(obj1);
obj2.methodB();

```
mooncakejs
2017 年 9 月 12 日
@xiaomeimei 配上 vscode 就不麻烦了。
xiaomeimei
2017 年 9 月 12 日
@murmur vue 已经在用了,用在网站上。而我们的浏览器扩展上用的是纯 js,直接换 vue,时间成本太高,划不来
xiaomeimei
2017 年 9 月 12 日
@zjsxwc 这种方式只可以实现子类使用了父类的 MethodB 方法,但不能强制子类也拥有 MethodA 方法
otakustay
2017 年 9 月 12 日
@murmur react 改成 createComponent 了?我感觉要么我穿越回了以前,要么我刚从火星回来

另外原型链丑陋在哪里了?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/389990

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX