2012-07-13 2 views
4

Мне очень трудно понять ООП в javascript.JavaScript ООП классы и декларации

Обычно я ожидал создать класс, а затем создать объекты из этого класса.

Однако, согласно одному руководству, следующий объект создает.

var egg = {} 

Я не просто создал объект с именем egg без фактического создания класса.

Если то случай, как бы я сделать несколько объектов из объекта: S

Кроме того, согласно другому учебник объект сделан, как показано ниже, совершенно разница, что мне было сказано выше: S

var Block = function(){ 

} 

Может кто-нибудь помочь мне распутать мое замешательство :(

+0

Возможный дубликат [Разница между конструктором и объектом] (http://stackoverflow.com/questions/4559207/difference-between-a-constructor-and-an-object) – qwertymk

+0

, но это не разрушает целое точка ООП? –

+0

кстати. вам не хватает нового в вашем заявлении 'var Block = ...' –

ответ

2

Javascript - это другой язык, отличный от тех, что вы изучили до сих пор. Вы не можете ожидать, что все будет работать так же, как и при смене языков.

Быстрый просмотр подхалима: в javascript вы можете назначить функцию переменной. Держу пари на этих других языках, которые вы использовали, что было невозможно:

var myCounter = 1; 
var myFunction = function(x){ return x + 1; }; 

Возвращаясь к вашему вопросу: В JavaScript нет «реальных классов». Есть только объекты. Я знаю, что сначала это может показаться странным.

Объектная модель Javascript называется «прототипным наследованием». Он отличается от «классического» (каламбурного) наследования. И это также not very cleanly implemented.

В принципе, вы начинаете с одного приведенного набора объектов (Array, Function, Object и т. Д. - это объекты, а не классы), а затем вы используете эти объекты для сборки других. Отношения между ними могут быть «классами и экземплярами», но им это не нужно. Они могут быть и другими видами отношений.

Поскольку классов нет, вы не можете их создать. Но вы можете создать обычный объект, назначить его переменной Car, и просто подумайте: «Я собираюсь использовать этот объект для создания множества других объектов, а те другие объекты будут иметь некоторые атрибуты по умолчанию, такие как методы и прочее, так что они ведут себя как автомобили ». И язык позволяет вам это делать. Автомобиль будет вести себя как класс на других языках, а объекты, которые он производит, будут «как экземпляры автомобиля».

К javascript, однако, они будут выглядеть как объекты с некоторыми отношениями между ними.

В некотором роде прототипное наследование является «надмножеством» классического наследования. Вы можете делать классическое наследование, но и другие вещи.

2

Разве я не только сделал объект с именем яйцо фактически не делая класс.

Это верно. Все, что вы делаете, создает экземпляр базового объекта Object - вы ничего не сделали, чтобы вы могли делать экземпляры из.

В JavaScript нет формализованной концепции классов - существует просто имитация их, достигаемая посредством создания экземпляров, а не вызывающих функций.

function Animal() { this.animal = true; } 
Animal.prototype.sayHi = function() { alert(this.name+' says hi!'); } 
function Dog(name) { this.name = name; } 
Dog.prototype = new Animal(); 
... 
var fido = new Dog('Fido'); 
fido.sayHi(); //"Fido says hi!"; 

Обратите внимание, что четвертая строка является лишь одним из нескольких способов имитации наследования.

Итак, в JavaScript классы и функции являются как просто функциями. Нет ничего особенного в том, чтобы предотвратить вызов функции, предназначенной для создания экземпляра, без оператора new, а также без визы.

В первом случае общая обходной путь, чтобы проверить, что конструктор является «класс» (если испробованы и не экземпляр, конструктор будет Object) и перенаправляться по мере необходимости:

function Dog(name) { 
    //if we weren't instantiated, the constructor will be Object, not Dog 
    if(this.constructor != Dog) return new Dog(name); 
    this.name = name; 
} 
var fido = Dog(); //bad - invocation should be instantiation 
+1

Это самый простой, хотя и наивный способ, который требует создания экземпляра базового объекта только для настройки прототипа. Достаточно хорошо, чтобы ответить на вопрос. Я написал сообщение о том, что составляет правильное наследование в JS. http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html –

+0

Вы совершенно правы, Хуан - это, безусловно, самый простой из нескольких способов реализации наследования (ни один из которых не является совершенны и все имеют особенности). Я включил его здесь, чтобы не смущать из основного момента ответа. Я проверю ваш пост. – Utkanos

+0

Я также написал о смягчении проблемы с вызовами функций-конструкторов без нового оператора :) http://js-bits.blogspot.com/2010/08/constructors-without-using-new.html, который, кажется, является тем, что вы делаете в своем тесте для этого.constructor' –

2

Да var egg = {} - это объект, но не экземпляр объекта.

В javascript просто говорить что-то таким образом - это в основном идея js о синглетоне, а это значит, что это именно то, что он равен.

//this is a js singleton, and all properties of this object are public. 
var egg = { 
    name: 'humpty', 
    smush: function() { console.log('splat!'); }, 
    weight: '4oz' 
}; 
console.log(egg.weight); //4oz 

а, тем более традиционный тип объекта бы сделать его функцию, вы можете создать экземпляр:

var Egg = function(name, weight) { 
    var name = name; 
    this.smush = function() { console.log('splat!'); } 
    this.weight = weight; 
}; 
var e2 = new Egg('dumpty','6oz'); 
console.log(e2.name); //will not return name. (since i wrote var name and not this.name, its "private" and thus cannot be accessed.) 
console.log(e2.weight); //4oz 
+0

Что означает «неопределенный, потому что мы имеем сферу действия»? Вы никогда не назначали 'this.name = name'. Кроме того, почему вы создаете имя локальной переменной, когда она уже есть (аргумент). Ответ на вопрос, но это не очень ясно. –

+0

О, я просто делал заметку о том, что в нашем объекте Egg() вы можете перестать просто публиковать, дифференцируя между var x и this.x ... я переписал это быть более ясным – Kristian

10

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

var myClass = function() { <----------------------------- class declaration 

      var prop1, 
       prop2, <------------------------------------ private properties 
       prop3; 

      var addMe = function(arg1, arg2) { <------------ private method 
       var result = arg1 + arg2; 
       return result; 
      } 

      var obj = { <------------------------------------- constructor method 
       Prop1: prop1, 
       Prop2: value2, <----------------------------- public properties 
       Prop3: value3, 

       Method: function() { <------------------------ public method 
        obj.prop3 = obj.prop1 + obj.prop2; 
        return obj.prop3; 
       } 
      } 

      obj.Prop4 = addme(prop1, prop2); <-------------- public property set 
                   with the private method 
      return obj; 
    } 

    var myClassObj = new myClass; 

myClassObj теперь объект MyClass с четырьмя открытыми свойствами prop1, prop2, Prop3, Prop4 и один общедоступный метод, называемый метод

Смежные вопросы