我在阅读Nats-Jetstream documentation时遇到了以下代码:

var createModel = require('jetstream').model;

var Shape = createModel('Shape', function() {
    this.has('x', Number);
    this.has('y', Number);
    this.has('width', Number);
    this.has('height', Number);
    this.has('type', Number);
});

我不确定this.has是什么意思?has是从哪里来的?这段代码是如何工作的?

推荐答案

库的形状被描述为in the docs.它有:

type JetStream : {
    model: (name: String, fn: ModelDefiner) => Model,

因此回调是一个ModelDefiner,定义如下:

type ModelDefiner : (this: Model) => void

所以thisModel,其定义如下:

type ModelObject : {
    has: (propertyName: String, PropertyType) => void,
    setScope: (scope: Scope, Callback<Error, void>) => void,
    getValues: () => Object,
    getAddSyncFragment: () => SyncFragment<"add">
}

-- A Model instance inherits from ModelObject.
type Model : ModelObject & {
    typeName: String,
    uuid: ObjectUUID,
    scope: Scope | null
}

正如您在上面看到的,Model扩展了ModelObject,而ModelObject有一个has方法.

如果您想知道如何编写自己可以做到这一点的代码,那么您真正需要做的就是创建一个具有has方法的对象,并使用它创建.call个回调函数.

class Model {
  has(str, type) {
    console.log('has called with', str, type);
  };
}
const createModel = (str, callback) => {
  const model = new Model();
  callback.call(model);
};

var Shape = createModel('Shape', function() {
    this.has('x', Number);
    this.has('y', Number);
    this.has('width', Number);
    this.has('height', Number);
    this.has('type', Number);
});

Javascript相关问答推荐

如何解决CORS政策的问题

阿波罗返回的数据错误,但在网络判断器中是正确的

在open shadow—root中匹配时,使用jQuery删除一个封闭的div类

Reaction Native中的范围滑块

将内容大小设置为剩余可用空间,但如果需要,可在div上显示滚动条

当输入字段无效时,我的应用程序不会返回错误

如何在不影响隐式类型的情况下将类型分配给对象?

JavaScript是否有多个`unfined`?

AJAX POST在控制器中返回空(ASP.NET MVC)

Phaserjs-创建带有层纹理的精灵层以自定义外观

如何在AG-Grid文本字段中创建占位符

自动滚动功能在当前图像左侧显示上一张图像的一部分

不协调嵌入图片

JavaScript -复制到剪贴板在Windows计算机上无效

如果对象中的字段等于某个值,则从数组列表中删除对象

更新文本区域行号

如何在Firebase中读取对象的特定字段?

在Java脚本/类型脚本中覆盖父构造函数中的默认值

JSdiscord机器人为什么不工作前缀?如何决定与discord机器人的问题?

Mongoose DeleteOne()和DeleteMany()不工作