2015-03-02 4 views
0

Из следующих двух способов, какой формат для определения объекта является хорошим, учитывая производительность и использование:Javascript определения объекта

//Object created with public members defined using this. 
var object1 = function() { 
    var private_i = null; 
    this.public_j = null; 

    //public function 
    this.public_func = function() { 
    } 

} 

ИЛИ

//Object created with public members defined using return patterns. 
var object2 = function() { 
    var private_i = null, 
    public_j = null, 

    //private function will be exposed from return statement. 
    _public_func = function() { 
    }; 

    return { 
    public_func : _public_func 
    }; 

} 
+0

Крокфорд рекомендует отмену 'this'. https://www.youtube.com/watch?v=PSGEjv3Tqo0 – m59

+0

Первый 1 это проще и меньше обработки. вы можете попробовать проверить производительность на jsperf. :) – frogcoder

+2

Эти 2 фрагмента не дают одинаковых результатов, следовательно, они несравнимы. – zerkms

ответ

1

Разница между ними относится к наследованию и использования. Ваш object2 всегда создает объекты, напрямую подкрепленные Object.prototype и не требует использования ключевого слова new; ваш object1 создает объект, поддерживаемый object1.prototype (который в свою очередь подкрепляется Object.prototype) и делает требует использования new.

Ничто не является «лучшим» в любом объективном способе, это всего лишь два разных способа использования JavaScript, которые будут иметь принципиально такую ​​же производительность. Первый - много более распространенный, второй - небольшим, но вокальным меньшинством в сообществе JavaScript.

object1 пример более типично записываются следующим образом:

function Object1() { 
    var private_i = null; 
    this.public_j = null; 

    //public function 
    this.public_func = function() { 
    }; 
} 

Обратите внимание, что первая буква в таких функциях прописные букв (подавляющая конвенцию).

Прототип вещь приходит в него, если вы собираетесь иметь функции, которые не нуждаются в доступе к private_i: Вы можете поместить те на объект, который будет назначен новым объектам, созданным с помощью new Object1 так:

function Object1() { 
    var private_i = null; 
    this.public_j = null; 
    //public function 
    this.public_func = function() { 
    }; 
} 
Object1.prototype.someOtherFunction = function() { 
    // Doesn't use `private_i` 
}; 

Вы также можете использовать прототипы с вашими object2, например, так:

//Object created with public members defined using return patterns. 
var object2Prototype = { 
    someOtherFunction: function() { 
     // Doesn't need private_i 
    }; 
}; 
var object2 = function() { 
    var private_i = null, 
     public_j = null, 

     //private function will be exposed from return statement. 
     _public_func = function() { 
     }; 

    var obj = Object.create(object2Prototype); 
    obj.public_func = _public_func; 
    return obj; 
}; 
Смежные вопросы