javascript - "has"表达式中的 "this.has"来自哪里?

标签 javascript node.js syntax nats.io nats-jetstream

我正在阅读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

所以this是一个Model,它在这里定义:

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
}

正如您在上面所看到的,模型扩展了模型对象,并且模型对象有一个 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 - "has"表达式中的 "this.has"来自哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74683231/

相关文章:

javascript - JavaScript 中一帧的碰撞检测

javascript - 如何从json渲染mustache js

javascript - 即使我尝试重新连接,socket.io 仍保持断开连接?为什么?

javascript - CYTOSCAPE JS dijkstra 算法与预设布局

c++ - 如何在if语句中定义变量和比较值?

syntax - Roslyn 语法树差异

javascript - MTurk : Posting experimental conditions simultaneously, 但只允许每个 worker 看到其中一个条件

javascript - 如何使用 Prettier 在代码块之间添加多行?

C 语法 : incrementing and assigning values in the same line

javascript - 为什么 ES6 IIFE 和 ES5 IIFE 的执行上下文不同?