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

标签 javascript function object properties undefined

我知道这可能是一个愚蠢的问题,但我是 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/

相关文章:

javascript - 在 js 对象中使用 `this`

PHP:将对象用作数据库产品的有效方法

javascript - Skrollr 页面上的移动导航栏水平滚动

php - 将 php 变量传递给动态生成的 div 的 onclick 事件

PHP 和 MySQL 函数返回

r - 如何找出 R 函数调用中使用了哪些参数值?

javascript - D3.js 中的数据操作

javascript - 作用域函数不适用于 JSON 对象

javascript - 在服务器上提供本地货币格式 i18n,并在客户端上进行处理

jquery - 停止 jQuery.css() 函数