Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   OOP в javascript (https://javascript.ru/forum/misc/12564-oop-v-javascript.html)

mycoding 23.10.2010 14:35

OOP в javascript
 
Извините за эмоции которые сейчас собираюсь написать...

Но почему в javascript через жопу сделано ООП?

Я пытаюсь уже второй год понять что и как.
Статьи по 50 раз читал на этом сайте, в книга и в других ресурсах.

Знаю 100% рабочий вариант, но не понимаю почему это так.

Самый большой косяк, это constructor.
Что это вообще за такое...

До чего все просто в с++ а здесь как будто специально это сделали, так что редко кто допрет.

В моем понимание следующие два кода должны быть идентичны.
Но один из них не рабочий.

function ClassWindow(){}

ClassWindow.prototype={
    constructor:{
        a:'',
        b:'',
        c:'',
        f1:function(){}
    },
    e:'',
    d:'',
    v:'',
    f2:function(){},
    f3:function(){}
}


function ClassWindow(){
    this.a='';
    this.b='';
    this.c='';
    this.f1=function(){}
}

ClassWindow.prototype={
    e:'',
    d:'',
    v:'',
    f2:function(){},
    f3:function(){}
}



В чем разница между ClassWindow.constructor и ClassWindow.prototype.constructor

Вообще почему ООП в js на прототипах?
В с++ я за один вечер все понял, прочитав 15 страниц текста

Sweet 23.10.2010 15:22

Цитата:

Сообщение от mycoding
Я пытаюсь уже второй год понять что и как.

На это есть хорошая поговорка: Нечего жопу мучить, если сра** не охота:)

mycoding 23.10.2010 15:23

Просто надо понять, без понимания очень сложно писать плагины и расширения для js-framework-ов.

monolithed 23.10.2010 15:38

Цитата:

Сообщение от mycoding
Но почему в javascript через жопу сделано ООП?

1. Наверное потому, что язык был написан всего за 10 дней, а эталоном были Java, Self и Lua
Цитата:

Сообщение от mycoding
Самый большой косяк, это constructor.
Что это вообще за такое...

constructor - свойство, значением, которого является ссылка на функцию-конструктор. Другими словами, когда появляется свойство prototype, оно уже имеет в своем составе значение представленное в виде свойства constructor.

Цитата:

Сообщение от mycoding
Вообще почему ООП в js на прототипах?

Потому как разработчику импонировали языки Self и Lua

prototype - свойство, которое инициализируется в момент определения функции. Иными словами это объект-образец, по которому создаются другие объекты, это просто свойство объекта, в котором содержатся все атрибуты и методы, которые будут наследоваться порождённым объектом (при использовании оператора new). то тут не понятно?

mycoding 23.10.2010 15:48

А почему constructor не получается увидеть вот так?
console.dir(ClassWindow);
или вот так?
var my = new ClassWindow();
console.dir(my);
Когда он появляется.
Просто в свойствах его нет, а при обращении он есть
ClassWindow.constructor и ClassWindow.prototype.constructor
my.constructor.

Вообще по моему мнению, если бы не Adobe уже давным давно был бы нормальный js и фитчи вроде webgl и css3-8 и html7-10 web 3.0-5.0
А так этот Adobe со свои Flash и Flex тормозит инет в развитии.

monolithed 23.10.2010 16:12

var Class = function(property){
    alert('constructor'); //constructor
    this.property = property;
}
    
var object = new Class('object');

Class.prototype.method = function(){
    alert('method'); //method
};

alert(object.property); //property
alert(object.method()); //method
alert(object.constructor == Class); //true
alert(Class.prototype.constructor == Class) //true

var c = 'prototype есть у всех объектов!';
//1
c.constructor.prototype.method = function(){ //только так делать не нужно!
    alert(this);
}
    
c.method();

//2
String.prototype.method = function(){
    alert(this);
}
    
c.method();

mycoding 23.10.2010 16:21

Эти два примера ещё больше запутали)))
Но все равно спасибо, что пытаешь объяснить)

У меня вообще за все время учебы две темы, которые понять не получается.
Это 3d с матрицами, кватернионами и другими способами и javascript
темы вроде ООП.
Хотя с js я сам разбираюсь.

monolithed 23.10.2010 16:34

Может этот пример поможет разобраться, а точнее расширить кругозор и не заморачиваться на прототипах:

var object = (function(){
    var instance = {
       property : 'property',
       method : function(){
           return 'method';
        }
    };
    return instance;
})();

alert(object.property) //property
alert(object.method()) //method
alert(object.constructor == Object); //true

mycoding 23.10.2010 16:42

А почему у object в данном случае при вот этом
console.dir(object);
Только один метод method и property
показывается, а prototype и constructor нету?

monolithed 23.10.2010 16:56

Мы же создаем функцию и соответственно вызываем ее свойства и методы, но внутри можно определить prototype и constructor.

сравни с предыдущим примером:
var object = (function(){
       this.property = 'property';
       this.method = function(){
           return 'method';
        };
    return this;
})();

alert(object.property) //property
alert(object.method()) //method
alert(object.constructor == Object); //false


Часовой пояс GMT +3, время: 11:56.