ES2015 类中的静态方法
在ES2015中,终于不用用函数原型来实现类系统,可以直接使用关键字class,下面是对class的静态属性的研究:
举例:一个Node类,每一个Node类之间都可以建立从属关系,每一个Node实例下方可以带多个Node子实例,Node自身可以检索到所有实例的数量。
首先创建两个属性,他爹,和他的子孙
this._parent = parent;
this._children = new Set();
创建生孩子的方法:(创建子节点)
createChild(){
const node = new Node(this);
this._children.add(node);
return node;
};
创建与孩子断绝关系的方法:(删除节点)
removeFromParent() {
this._parent._children.delete(this);
this._parent = null;
};
创建人口普查方法:(获取节点大小)
get size() {
let size = 0;
for (const node of this._children) {
size += node.size
};
size = size ? size + 1 : 1
return size;
};
创建家谱:(将根节点存储起来)
static addRoot(root) {
Node.roots = !Node.roots ? [root] : Node.roots.concat([root]);
};
看看家族中一共多少人:(获取根节点的所有节点)
static get size () {
return Node.roots
.map(root => root.size)
.reduce((a,b) => a + b);
}
整个程序代码为:
class Node {
constructor(parent = null) {
this._parent = parent;
this._children = new Set();
if (this.isRoot) {
Node.addRoot(this)
};
}
get isRoot() {
return !this._parent;
};
createChild(){
const node = new Node(this);
this._children.add(node);
return node;
};
removeFromParent() {
this._parent._children.delete(this);
this._parent = null;
};
get size() {
let size = 0;
for (const node of this._children) {
size += node.size
};
size = size ? size + 1 : 1
return size;
};
static addRoot(root) {
Node.roots = !Node.roots ? [root] : Node.roots.concat([root]);
};
static get size () {
return Node.roots
.map(root => root.size)
.reduce((a,b) => a + b);
}
}
静态属性的好处在于可以为类本身定义一些方法,而不是实例的方法(原型链上)。
静态属性还有一个参数固化的功能:
先定义一个Animal
class Animal {
constructor (family, species, hue) {
this.family = family;
this.species = species;
this.hue = hue;
};
yell(){
return `I'm ${this.species}`;
};
再定义一个扩展的功能,传入扩展的功能函数和传给Animal的参数
static extend(constructor,..._args) {//..._args为Animal中的参数
return class extends Animal {
constructor(...args) {
super(..._args);
constructor.call(this,...args);
}
}
}
}
最后检查结果
const Dog = Animal.extend(function(name){
this.name = name;
},'four_feet','dogy','woug');
const dog1 = new Dog('Doge');
dog1.yell();//woug
console.log(dog1.name);//Doge
由此可以看出可以给Animal类扩展任意功能然后赋值给一个新的类。在写可维护代码的时候至关重要。
ES2015 类中的静态方法的更多相关文章
- java 多线程3:Thread类中的静态方法
Thread类中的静态方法 Thread类中的静态方法表示操作的线程是"正在执行静态方法所在的代码块的线程".为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程 ...
- C#中类的实例是不能 获取到类中的静态方法和静态变量(Static)的,及原因
类中的静态方法和变量是共享的.只能用类名去调用.
- 第7.17节 Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析
第7.17节 Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析 静态方法也是通过类定义的一种方法,一般将不需要访问类属性但是类需要具有的一些能力可以静态方法提供. 一 ...
- Thread类中的静态方法
1.currentThread() currentThread()方法返回的是对当前正在执行线程对象的引用. package thread; /** * 线程类的构造方法.静态块是被main线程调用的 ...
- Java多线程3:Thread中的静态方法
Thread类中的静态方法 Thread类中的静态方法表示操作的线程是"正在执行静态方法所在的代码块的线程".为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程 ...
- python中的静态方法和类方法
在python中,各种方法的定义如下所示: class MyClass(object): #在类中定义普通方法,在定义普通方法的时候,必须添加self def foo(self,x): print & ...
- String类中常用的操作
一.获取: 1.获取字符串的长度(注意是方法,不是跟数组的属性一样的) int length(); 1 public static void getLength(){ 2 String s = &qu ...
- Java多线程4:Thread中的静态方法
一.Thread类中的静态方法 Thread类中的静态方法是通过Thread.方法名来调用的,那么问题来了,这个Thread指的是哪个Thread,是所在位置对应的那个Thread嘛?通过下面的例子可 ...
- @selector 如何调用在另一个类中的静态函数?
可以在同一个类的methodName这个函数中再调用另一个类中的静态方法
随机推荐
- bzoj1555 KD之死 贪心+堆优化
1555: KD之死 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 124 Solved: 54[Submit][Status][Discuss] D ...
- 【转】磁盘I/O那些事
背景 计算机硬件性能在过去十年间的发展普遍遵循摩尔定律,通用计算机的CPU主频早已超过3GHz,内存也进入了普及DDR4的时代.然而传统硬盘虽然在存储容量上增长迅速,但是在读写性能上并无明显提升,同时 ...
- ubuntu17.10 python3.6 install plugins for AI
install order: tensorflow-gpu scikit-learn numpy scipy matplotlib tkinter tensorflow-gpu : pip insta ...
- Ecshop中transport和jquery不兼容的解决方案
1.修改文件:/js/transport.js,在最底部增加代码 if (Object.prototype.toJSONString){ var oldToJSONString = Object.to ...
- DxPackNet 1.打开摄像头
好久没写博客了 ,这个系列将给大家介绍.net下一个非常好用的视频控件 ------ DxPackNet, 用这个控件大家可以轻松开发出 视频会议,视频监控,远程桌面,远程教学,远程白板,视频直播,视 ...
- nyoj 1129 Salvation 模拟
思路:每个坐标有四种状态,每个点对应的每种状态只能走一个方向,如果走到一个重复的状态说明根本不能走到终点,否则继续走即可. 坑点:有可能初始坐标四周都是墙壁,如果不判断下可能会陷入是死循环. 贴上测试 ...
- Elasticsearch安装使用
在网上有很多那种ES步骤和问题的解决 方案的,不过没有一个详细的整合,和问题的梳理:我就想着闲暇之余,来记录一下自己安装的过程以及碰到的问题和心得:有什么不对的和问题希望及时拍砖. 第一步:环境 li ...
- Socket 参数笔记
//服务端@RunWith(JUnit4.class) public class ServerSocketTest { @Test public void testServer() throws IO ...
- Python接口自动化测试 HTTP协议
一.HTTP协议简述 二.URL 三.请求 四.响应 五.消息报头 六.常见问题
- python 小练习之生成手机号码
需求分析: 1 将固定的号码段放到list中 如:136 137 180 183等等 2 随机取8个数字元素 3 将固定号码段与随机产生的元素拼接在一起 4 写入文件 import stringdef ...