"has" "this.has"表达从何而来?



我正在阅读Nats-Jetstream文档,我遇到了以下代码:

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从何而来?这些代码是如何工作的?

文档中描述了库的形状。它有:

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
}

正如您在上面看到的,一个模型扩展了一个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);
});

当你感到好奇时,最好看看他们提供的源代码。由于这是一个节点项目,首先要检查的是包。Json——主要是"索引"。所有的导出都将在lib/index.js中定义。

查看lib/index.js第52行,我们看到model被定义为导出——它是一个函数,您在其中传递一个名称和定义,并将其传递给ModelObject.model;如果你向上滚动,你可以看到它包含在libs/model_object.js中。

转到libs/model_object,您可以看到传递的定义字段(您在示例代码中看到的lambda函数)用于:definitions.call(typeClass)typeClass是前面在函数中创建的。如果您不熟悉call的作用,它允许函数在另一个对象中执行——您在传递的函数中看到的this将引用typeClass对象。在libs/model_object.js中,定义了一个has函数来添加ModelObjectProperties;this.has被用来向ModelObject添加属性。

编辑:CertainPerformance的答案可能更清楚,请参考。

相关内容

最新更新