gpt4 book ai didi

使用创建的对象调用另一个函数后,Javascript 创建的对象属性值未定义

转载 作者:行者123 更新时间:2023-11-30 15:41:50 29 4
gpt4 key购买 nike

我知道这可能是一个愚蠢的问题,但我是 javascript 的新手,所以希望得到一些指导。

我创建了以下 notificationSocketEventHandler 对象:

const notificationSocketEventHandler = Object.create(socketHandlerProto, {
validators: {
created: [],
destroyed: [],
loadedFromSocket: [],
updated: [],
addedto: {
relation: []
},
removedfrom: {

}
},
created: function (data) {
if (this.validateProfileData(data, validators.created)) {} else {}
},
destroyed: function (data) {},
updated: function (data) {},
loadedFromSocket: function (data) {
console.log('Loaded from socket')
console.log(data)
}
})

此事件处理程序用于监听来自套接字的通知so and 是这样设置的

$.globals.socket.on('notifications',notificationSocketEventHandler);

事件原型(prototype)定义如下:

$.globals.socket = {
events: {},
on: function (attr, func) {
if (!attr) return false
this.events[attr] = this.events[attr] || [];
this.events[attr].push(func)
return true
},
remove(attr, func) {
if (!events[attr]) return false

this.events[attr].forEach(function (f, indx) {
if (f === func) {
events[attr].slice(indx, 1)
}
})
},
trigger: function (attr, thisArg, paramArgs) {
if (Array.isArray(attr) && attr.length) {
var obj = this.events[attr[0]]
for (var i = 1; i < attr.length; i++) {
if (!obj) return
obj = obj[attr[i]]
}
if (typeof obj == 'function') obj.apply(thisArg, paramArgs)
if (Array.isArray(obj)) {
obj.forEach(function (c) {
if (typeof c == 'function') c.apply(thisArg, paramArgs)
})
}
return
}
if(this.events[attr]){
console.log(this.events[attr])
this.events[attr].forEach(function (f) {
if (typeof f === 'function')
f.apply(thisArg, paramArgs)
})
}
}
}

我遇到的问题是,在 notificationSocketEventHandler 对象被传递给 $.globals.socket.on 函数并最终插入事件对象后,属性notificationSocketEventHandlercreateddestroyedloadedFromSocket 在传递给 之前被定义为函数>$.globals.socket.on 函数,在事件对象中突然变为“undefined”,这是为什么?

最佳答案

Object.create 有点令人困惑 - 你不能使用普通对象作为第二个参数,它必须是“属性描述符”的对象。为了正常工作,您的代码需要按照以下行进行格式化:

const notificationSocketEventHandler = Object.create(socketHandlerProto, {
'validators': {
value: {
'created': {
value: []
},
'destroyed': {
value: []
},
'loadedFromSocket': {
value: []
}
}
}
});

除非您遍历这些属性,否则它会很乏味。你最好避免使用 Object.create 并正常创建一个对象:

const notificationSocketEventHandler = {
created: [],
destroyed: [],
etc...
}

或将属性添加到构造函数的原型(prototype)(顺便说一句,人们通常使构造函数名称以大写字母开头,因此很明显它们是构造函数 - 无需在名称末尾添加“Proto”一件事。无论如何):

var SocketHandler = function {
this.created = [];
this.destroyed = []
etc...
}

const notificationSocketEventHandler = new SocketHandler

var SocketHandler = {};
SocketHandler.prototype.created = [];
SocketHandler.prototype.destroyed = [];
etc...

关于使用创建的对象调用另一个函数后,Javascript 创建的对象属性值未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40688376/

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