【问题标题】:Adding methods to an JavaScript object向 JavaScript 对象添加方法
【发布时间】:2023-03-10 20:41:02
【问题描述】:

我可以用一些方法创建一个对象,然后给它添加一个属性,如下所示:

var myObj = (function () {
    var my = {};
    my.method1=function(){}
    my.method2=function(){}
    my.method3=function(){}
    return my;
    }());
myObj.myProperty=123;

如何先创建对象并添加属性,然后再添加方法?

myObj={};
myObj.myProperty=123;
//How do I add the above methods to myObj?

【问题讨论】:

  • myObj.my = { method1: function() }
  • 为什么不能使用myObj.method1 = function() {}
  • 我假设您不只是在做myObj.method1=function(){};,因为您希望在自己的范围内定义函数?否则我真的不明白问题出在哪里。
  • @FelixKling 是的,他们每个人都有自己的脚本。
  • @ShawnBush 我想我可以,但我展示的方式似乎是一种组织它们的干净方式。

标签: javascript oop object methods


【解决方案1】:

我猜有两种解决方案:

合并对象:

var myObj = {...};
// ...
var objWithMethods = (function() { ... }());
Object.assign(myObj, objWithMethods);

Object.assign 是一种 ES6 方法。可以在链接中找到 polyfill,库通常也提供具有类似行为的方法)。

传递应该分配方法的对象作为参数:

var myObj = {};
myObj = (function (obj) {
    var my = obj || {};
    my.method1=function(){}
    my.method2=function(){}
    my.method3=function(){}
    return my;
}(myObj));

【讨论】:

  • 谢谢菲利克斯。你会推荐一种方法而不是另一种方法吗?我想我会选择第二个选项,除非你有不同的想法。
  • 此时,最重要的因素是读代码的人都明白发生了什么。
  • 嗯,我绝对理解第二种方法,但目前还不是第一种方法。假设我应该同时学习它们。谢谢!
【解决方案2】:

您可以使用现有对象进行扩展操作

var myObj = {...}

var myAdditionalMethods = { someMethod : function(){ } }

//extend the object
for(var i in myAdditionalMethods)
   if(!myObj.hasOwnProperty(i)) 
       myObj[i] = myAdditionalMethods[i];

很多库都内置了这个功能,但如果没有这个功能,你会这样做

【讨论】:

    【解决方案3】:

    即使原型也可以将功能添加到原始对象。

     var myObj = function() {
       this.myProperty = 123;
     }
    
     myObj.prototype.method1 = function method1() {
       alert("method1")
     }
     myObj.prototype.method2 = function method2() {
       alert("method2")
     }
     var newObj = new myObj();
     newObj.method1();
     newObj.method2();
     console.log(newObj)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      相关资源
      最近更新 更多