Как создать метод для пользовательского объекта в JavaScript? - PullRequest
50 голосов
/ 02 февраля 2009

Это как ...

var obj = new Object();

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

или что-то подобное?

Ответы [ 7 ]

88 голосов
/ 03 февраля 2009

Вы можете видеть из ответов, которые у вас уже есть, что есть несколько способов.

#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, будут использовать идентичный метод 'method', потому что это свойство их прототипа. Это экономит память (но только очень маленькое количество), и если вы измените метод прототипа, все объекты # 4 будут немедленно обновлены - даже если они уже были созданы.

# 1, # 2 и # 5 все в значительной степени эквивалентны. Это потому, что, вероятно, будет только один из них за раз, поэтому тот факт, что # 2 имеет метод, добавленный к прототипу, на самом деле не имеет значения. (без учета клонирования)

Существует еще больше способов добавления методов к объектам с использованием фабрик с закрытием или добавления «статических» свойств / методов к функциям или частным вложенным функциям ...:)

53 голосов
/ 02 февраля 2009
var newObj = {
    met1 : function () {
        alert('hello');
    }
};

Тогда метод можно назвать так:

newObj.met1();

Кстати, при объявлении нового объекта используйте литерал объекта ({}), а не конструктор new Object().

13 голосов
/ 02 февраля 2009

Обычно используется свойство прототип :

function YourObject()
{
    //
}

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

Одна вещь, о которой я еще не упоминал, это то, почему вы можете использовать свойство prototype, скажем, для объектно-литеральной нотации: это гарантирует, что определение функции будет общим для всех экземпляров объектов, созданных из прототип вашей функции, а не один раз за экземпляр.

2 голосов
/ 15 октября 2013

Не беспокойся, братан, вот код:

  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());
1 голос
/ 01 декабря 2015

С es6 вы можете сделать это так:

var a = {
    func(){
        return 'The value';
    }
}
    
document.getElementById('out').innerHTML = a.func();
   
<div id="out"></div>
1 голос
/ 08 февраля 2011

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);
0 голосов
/ 26 мая 2015

Вы также можете сделать следующее вместо использования метода 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...