Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   свойство в prototype (https://javascript.ru/forum/misc/27073-svojjstvo-v-prototype.html)

bot87 02.04.2012 00:02

свойство в prototype
 
function Animal(name) {
  this.name = name;
}
 
Animal.prototype.eats = true;
 
Animal.prototype.run = function() {
  this.eats = false;
  alert(this.name + ' бежит!');
};
 
var animal = new Animal('Зверь'); // (1)
animal.run();

меня интересует prototype.eats.Можно объяснить зачем добавлять свойство в прототип и что оно дает.Как оно наследуется?

dmitriymar 02.04.2012 00:04

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

bot87 02.04.2012 01:00

огромное спасибо

bot87 02.04.2012 01:20

как ее почитать??КХорошо излагаеш мысли.:)

bot87 02.04.2012 01:26

А вот эту штуку с this.блаБлаБла = 221
внутри конструктора добавили для пущего выебона, чтобы конструктор обьекты не только с прототипа копировал, а еще и что-то новое добавлял.


Типа общие свойства для клонов задаются в прототипе а функция конструктор делает их особенными?я думал наоборот:blink:

devote 02.04.2012 01:57

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

вот небольшой пример иллюстрирующий то как приватные переменные пересекаются.
// создаем родительский объект с приватной переменной
var Parent = (function() {
    var a = "test"; // наша приватная переменная
    var Fn = function() {}
        // публичные методы
    Fn.prototype.changeTest = function() {
            a = "new value";
    }
    Fn.prototype.show = function() {
            alert( a );
    }
    return Fn;
})();

// дочерний конструктор, который наследует Parent
function Child() {}

function F(){}
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.constructor = Child;

var q = new Child(); // создаем один экземпляр Child
var w = new Child(); // создаем второй экземпляр Child

q.show(); // отобразим текущее приватное значение
q.changeTest(); // сменим приватную переменную

w.show(); // отобразим приватную переменную через другой экземпляр.
Результат того что для каждого экземпляра нужно пересоздавать приватные переменные. Конечно же это можно обойти в JavaScript но это уже далеко станет не прототипным наследованием.

devote 02.04.2012 02:13

я поправил пример.
Цитата:

Сообщение от Maxmaxmахimus
а приватные свойства нужно именовать как __prop

Будь добр пример мне покажи.

devote 02.04.2012 02:42

Цитата:

Сообщение от Maxmaxmахimus
devote, дело в том что this определяется по форме вызова в зависимости от того что слева от функции через точку.

я вкурсе откуда возникает this и кто/что в него кладут. Ты мне пример покажи реализации того что бы для каждого нового дочернего экземпляра создавались собственные приватные переменные, и не просто имитация приватных свойств, которые все равно можно достать из дочернего элемента, а именно что не на есть приватные. Которые как я сказал будут для каждого экземпляра собственные. Возьмем пример с PHP:
class Parent {
    private var $variable = "lalalala";
    public function setPrivate( $val ) {
        $this->variable = $val;
    }
    public function getPrivate() {
        return $this->variable;
    }
}

class Child1 extends Parent {
}

class Child2 extends Parent {
}

$child1 = new Child1();
$child2 = new Child2();

echo $child1->getPrivate(); // выведет "lalalala"
$child1->setPrivate( 'new value' );
echo $child1->getPrivate(); // выведет "new value"

echo $child2->getPrivate(); // выведет "lalalala"

devote 02.04.2012 02:43

Цитата:

Сообщение от Maxmaxmахimus
и тут работаешь с ними как обычно, зная что то что начинается с __ это приватные поля. так же желательно исключить их из перечисления и.т.п.

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

devote 02.04.2012 02:48

Цитата:

Сообщение от Maxmaxmахimus
что это значит?

это значит что ты мне предлагаешь имитировать приватные переменные которые можно достать из любого места, то-есть в любом случае они не приватные а публичные.
Цитата:

Сообщение от Maxmaxmахimus
почему?

потому что это не чистый приват, а имитация.


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