gpt4 book ai didi

javascript - 创建一个接受对象字面量的函数并从该对象的成员创建一个类

转载 作者:行者123 更新时间:2023-12-04 07:23:27 24 4
gpt4 key购买 nike

我的问题:

var Person = makeClass( // Make a class with 2 instance methods which are initialize and say 
{
initialize: function(name) {
this.name = name;
},
say: function(message) {
return this.name + " says: " + message;
}
}
);
documentation of the @lends tag of jsdoc ,我发现他们正在使用一个辅助函数,他们说它可以接受一个对象文字并从该对象的成员创建一个类。在上面的例子中, makeClass函数创建一个 Person类,它们有 2 个实例方法(或者它们也可以是静态方法),它们是 initializesay .我想知道我们是如何创建这种功能的。
我想知道的是:
我试图重新创建那种功能,但对我来说真的很难,我不知道有什么办法可以做到。所以希望你们能给我一个重新创建这个的方法 makeClass功能。
我也想知道这种创建类的方式是不是很奇怪,或者你可以想像 makeClass这样的函数有用与否。
我为什么要创建该函数的原因:
如果你问我原因,那么我想知道函数内部的“成分”以便理解JSDoc的@lends标签,我想真正了解JSDoc中这个@lends标签的用例。但是面对这种奇怪的创建类的方式(对我来说很奇怪,我以前总是使用 ES6 类)我真的很难理解 @lends 标签。

最佳答案

首先,您可以查看 MDN docs on classes .在那里你会找到一些重要的信息:

Classes are in fact just "special functions"


而且,稍微解释一下:

Just as you can define function expressions ... you can define class expressions


所以,如果类表达式可以像函数表达式一样创建,而类只是“特殊函数”,那么暂停一下并问自己:我们如何编写一个创建函数的函数?
有不止一种方法可以解决这个问题,但鉴于您上面的示例,希望这是有道理的:
const makeFunction = function(valToAdd) {
return function(val) {
return val + valToAdd;
}
}

const addTwo = makeFunction(2);
addTwo(2) // 4
现在,翻译 makeFunction进入 makeClass希望更直接一点。范式是相同的,但我们必须做更多的工作来创建实例方法:
const makeClass = function(obj) {
// Anonymous class expression
const dynamicClass = class {};

// Define properties on our class
for (const [name, value] of Object.entries(obj)) {
// Notice we define properties on the prototype so instances of the class can access them
Object.defineProperty(dynamicClass.prototype, name, {
value,
writable: true,
configurable: true
})
}
return dynamicClass;
}

// Create a Person class with methods `initialize` and `say`
const Person = makeClass({
initialize: function(name) {
this.name = name;
},
say: function(message) {
return this.name + " says: " + message;
}
})

// Create an instance
const person = new Person()

person.initialize("Sam")
person.say("Hello!") // Sam says: Hello!
并回答您的一些具体问题:

I also want to know if this kind of creating class way is strange or not, or you can think the kind of function like makeClass is useful or not.


我认为这是一种奇怪的创建类的方法,尽管在某些用例中它可能很有用。一般来说,这种范式被称为 metaprogramming并且通常用于整合共享功能。权衡是复杂性很容易膨胀并让其他使用您的代码的人感到困惑。

I want to ... understand the @lends tag of JSDoc.


因为路 makeClass创建实例方法(它本质上是复制它们), JSDoc不了解创建的类可以使用哪些方法。所以这现在应该是有意义的(来自 JSDoc 文档):

The @lends tag tells JSDoc that all the member names of that object literal are being "loaned" to a variable named Person.

Person变量是我们的类,用 @lends 注释对象文字告诉 JSDoc我们正在“借出” initializesay它的成员。

关于javascript - 创建一个接受对象字面量的函数并从该对象的成员创建一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68356205/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com