【问题标题】:How do you create a method for a custom object in JavaScript?如何在 JavaScript 中为自定义对象创建方法?
【发布时间】:2010-10-05 00:35:03
【问题描述】:

是不是……

var obj = new Object();

obj.function1 = function(){
    //code
}

或者类似的?

【问题讨论】:

    标签: javascript object methods


    【解决方案1】:

    您可以从已有的答案中看出,方法不止一种。

    #1
    var o = new Object();
    o.method = function(){}
    
    #2
    var o = new Object();
    o.prototype.method = function(){}
    
    #3
    function myObject() {
        this.method = function(){}
    }
    var o = new myObject();
    
    #4
    function myObject() {}
    myObject.prototype.method = function(){}
    var o = new myObject();
    
    #5
    var o = {
        method: function(){}
    }
    

    #3 和#4 正在使用构造函数。这意味着您可以使用它们创建多个相同“类”的对象(类在 JavaScript 中并不真正存在)

    #4 与#3 不同,因为使用#4 构造的所有对象都将共享相同的“方法”方法,因为它是其原型的属性。这节省了内存(但只节省了非常少的内存),如果您更改原型的方法,所有#4 对象都将立即更新——即使它们已经被实例化。

    #1、#2 和#5 都差不多。这是因为一次可能只有其中一个,所以 #2 将方法添加到原型中这一事实并不重要。 (不考虑克隆)

    还有更多方法可以使用带闭包的工厂向对象添加方法,或者向函数或私有嵌套函数添加“静态”属性/方法...:)

    【讨论】:

    • 如何为每个 HTML 元素定义方法(例如hasClass)?
    • #2 不起作用。请从有 72 个赞的答案中删除它:-)
    【解决方案2】:
    var newObj = {
        met1 : function () {
            alert('hello');
        }
    };
    

    然后,方法可以这样调用:

    newObj.met1();
    

    顺便说一句,在声明新对象时,请使用对象字面量 ({}),而不是 new Object() 构造函数。

    【讨论】:

    • "在声明一个新对象时,使用对象字面量 ({}),而不是 new Object() 构造函数。" - 为什么?
    • @PaulD.Waite:我相信没有逻辑上的区别,但对象文字更紧凑,允许在同一语句中设置属性,并且通常是更被接受的方式(stackoverflow.com/q/4597926/1175459 )。
    【解决方案3】:

    一般使用prototype属性:

    function YourObject()
    {
        //
    }
    
    YourObject.prototype.yourMethod= function()
    {
       //
    }
    

    我还没有看到任何人提到的一件事是为什么你可能想要使用 prototype 属性而不是对象文字表示法:这样做可以确保函数定义在创建的对象的所有实例之间共享您的函数原型,而不是每次实例化一次。

    【讨论】:

    • 呃,不,实际上这不起作用。您可以通过将方法添加到函数的原型属性然后实例化它来将方法添加到对象,但不能通过修改实例上名为“prototype”的属性。
    • 对不起,我是这个意思,是的;我整个上午都在编写 ActionScript。 :) 我会纠正的。嘿,感谢那些对我投反对票的人;很感激。
    • 已更正,并删除了我的反对票。 FWIW,我对您投了反对票,因为您的示例不正确并且您在列表的顶部 - 可悲的是,并不是每个人都愿意验证他们支持的答案是否真的有效。
    • 谢谢。 FWIW,我确实会努力检查我的后续 cmets;一看到你的,我就开始改正。没有必要投反对票。
    【解决方案4】:

    别着急,代码如下:

      var myObj=function(){
          var value=null
    
         this.setValue=function(strValue){
    
         this.value=strValue;
         };
    
         this.getValue=function(){
         return this.value;
         };    
    };
    

    你可以这样调用这个对象:

        var obj= new myObj();
        obj.setValue("Hi!");
        alert(obj.getValue());
    

    【讨论】:

      【解决方案5】:
      
      Function.prototype.implement = function(member, value) {
         this[member] = value;
         return this;
      }
      
      function MyFunction() {
       //...
      }
      
      (function($){
      
       $.implement("a", "blabla")
       .implement("b", function(){ /* some function */ })
       .implement("c" {a:'', b:''});
      
      })(MyFunction);
      

      【讨论】:

        【解决方案6】:

        使用es6,您可以这样做:

        var a = {
            func(){
                return 'The value';
            }
        }
            
        document.getElementById('out').innerHTML = a.func();
           
        <div id="out"></div>

        【讨论】:

        【解决方案7】:

        您还可以执行以下操作,而不是使用“Object.create()”方法。

        函数调用:

        com.blah.MyChildObj.prototype = createObject(com.blah.MyParentObj.prototype, 
            com.blah.MyChildObj);
        

        函数定义:

        function createObject(theProto, theConst) {
            function x() {};
            x.prototype = theProto;
            x.prototype.constructor = theConst;
            return new x();
        }
        

        【讨论】:

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