在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 类中的静态方法的更多相关文章

  1. java 多线程3:Thread类中的静态方法

    Thread类中的静态方法 Thread类中的静态方法表示操作的线程是"正在执行静态方法所在的代码块的线程".为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程 ...

  2. C#中类的实例是不能 获取到类中的静态方法和静态变量(Static)的,及原因

    类中的静态方法和变量是共享的.只能用类名去调用.

  3. 第7.17节 Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析

    第7.17节  Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析 静态方法也是通过类定义的一种方法,一般将不需要访问类属性但是类需要具有的一些能力可以静态方法提供. 一 ...

  4. Thread类中的静态方法

    1.currentThread() currentThread()方法返回的是对当前正在执行线程对象的引用. package thread; /** * 线程类的构造方法.静态块是被main线程调用的 ...

  5. Java多线程3:Thread中的静态方法

    Thread类中的静态方法 Thread类中的静态方法表示操作的线程是"正在执行静态方法所在的代码块的线程".为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程 ...

  6. python中的静态方法和类方法

    在python中,各种方法的定义如下所示: class MyClass(object): #在类中定义普通方法,在定义普通方法的时候,必须添加self def foo(self,x): print & ...

  7. String类中常用的操作

    一.获取: 1.获取字符串的长度(注意是方法,不是跟数组的属性一样的) int length(); 1 public static void getLength(){ 2 String s = &qu ...

  8. Java多线程4:Thread中的静态方法

    一.Thread类中的静态方法 Thread类中的静态方法是通过Thread.方法名来调用的,那么问题来了,这个Thread指的是哪个Thread,是所在位置对应的那个Thread嘛?通过下面的例子可 ...

  9. @selector 如何调用在另一个类中的静态函数?

    可以在同一个类的methodName这个函数中再调用另一个类中的静态方法

随机推荐

  1. 卷积神经网络(CNN)在句子建模上的应用

    之前的博文已经介绍了CNN的基本原理,本文将大概总结一下最近CNN在NLP中的句子建模(或者句子表示)方面的应用情况,主要阅读了以下的文献: Kim Y. Convolutional neural n ...

  2. dubbo filter实现接口认证springboot idea

    最近公司有业务需求,要对Dubbo接口调用者进行身份验证,验证通过才能调用,网上一些资料不够全面,遂整理了一下. 在provider方定义一个filter,需要实现com.alibaba.dubbo. ...

  3. 回归模型效果评估系列1-QQ图

    (erbqi)导语 QQ图全称 Quantile-Quantile图,也就是分位数-分位数图,简单理解就是把两个分布相同分位数的值,构成点(x,y)绘图:如果两个分布很接近,那个点(x,y)会分布在y ...

  4. hql语句中的select字句和from 字句

    package com.imooc.model; import java.util.List; import java.util.Map; import org.hibernate.Query; im ...

  5. Duilib第一步(II)-Hello World

    My first Duilib program 1. Prepare for development 打开DuiFarm项目DuiFarm.cpp文件,将除_tWinMain函数之外所有内容删除.删除 ...

  6. B. Pyramid of Glasses

    原题链接 B. Pyramid of Glasses Mary has just graduated from one well-known University and is now attendi ...

  7. kibana常用聚合查询DSL语句记录

    -------- GET winlogbeat-2017.11.*/_search { "query": { "bool": { "must" ...

  8. nginx笔记2-负载均衡

    负载均衡实现方式分为两类:1硬件类,2软件类. 硬件类:F5(这是一种硬件,并不是刷新啊,不要误解)  优点:非常快,可靠性高,并发量大.缺点:太贵,成本高,不方便,最致命的是不能将动态请求和静态请求 ...

  9. Typescript 基础应用

    什么是 TypeScript TypeScript 是微软开发的 JavaScript 的超集,TypeScript兼容JavaScript,可以载入JavaScript代码然后运行.TypeScri ...

  10. 浅谈this关键字

    在我学习this关键字的时候,通过查找资料总结出一些this的特殊用法, 供大家参考,代码里面有我总结的分析过程! 箭头函数里的this: var username = "全局"; ...