среда, 31 августа 2016 г.

наследование в JS - немного поразбирался

после этого поста еще доразбирался - можно тут посмотреть

есть дедовский способ наследования через прототипы:

у каждой функции есть свойство prototype. Смысл его - в том, что при вызове функции с ключевым словом new - создается объект, а функция выступает в качестве его конструктора (и может использовать указатель this). так вот, если у этого объекта запросить поле (в т.ч. , функцию), которое не было в нем инициализировано - это поле будет искаться в объекте, на который ссылается внутренний (недоступный программисту) указатель [[prototype]]. А указатель этот указывает на объект, который был в свойстве prototype функции-конструктора на момент вызова оператора new.
и можно в свойство prototype функции-конструктора вписать просто объект с полями.
а можно в качестве прототипа вписать созданный через new объект класса-предка.

следует заметить, что, даже если вызывается функция, являющаяся членом прототипа - в качестве this к ней приходит указатель на созданный через new объект, а не на объект, который лежит в [[prototype]].



function A(){

    this.Inc = function(){

        if (!this.Val)

            this.Val = 1;

        else

            this.Val++;

    }

}


function B(){

}


B.prototype = new A();



var a1 = new B();

var a2 = new B();


a1.Inc();

a2.Inc();

a1.Inc();


console.log(a1.Val);    //2

console.log(a2.Val);    //1
минус подхода - в том, что у родительского класса не может быть параметров конструктора


сейчас этот подход считается устаревшим. вместо него нужно использовать метод object.Create(его поддерживает даже IE9, вроде, так что можно уже использовать), который позволяет делать всякие навороты типа полей только для чтения и свойств с геттерами и сеттерами.
http://www.htmlgoodies.com/beyond/javascript/object.create-the-new-way-to-create-objects-in-javascript.html


но я не стал заморачиваться и изучать, думаю, пока и дедовского способа хватит

дополнение:
описанный выше способ наследования - прототипный.
а есть еще прием, который называется функциональным наследованием:


// Base object constructor function
function base(spec) {
    var that = {}; // Create an empty object
    that.name = spec.name; // Add it a "name" property
    return that; // Return the object
}

// Construct a child object, inheriting from "base"
function child(spec) {
    var that = base(spec); // Create the object through the "base" constructor
    that.sayHello = function() { // Augment that object
        return 'Hello, I\'m ' + that.name;
    };
    return that; // Return it
}

// Usage
var object = child({ name: 'a functional object' });
result.textContent = object.sayHello();


не используется ключевое слово this (говорят, с ним может быть гемор), можно использовать параметры конструктора... хороший способ!

http://julien.richard-foy.fr/blog/2011/10/30/functional-inheritance-vs-prototypal-inheritance/

суббота, 27 августа 2016 г.

Установка Visual Studio 2015 Community Edition

устанавливаю Visual Studio 2015 Community edition , англ. версию
Установка заканчивалась отчетом о множественных ошибках, что через загрузчик, что через ISO.
ошибки - схожи с описанными здесь:
http://stackoverflow.com/questions/33855177/multiple-errors-installing-visual-studio-2015-community-edition/33881460

много чего перепробовал, но, если не ошибаюсь, в итоге помогло решение, предложенное по этой ссылке. Но с нюансами.
1) нужно деинсталлировать vc redistributable 2015 (все, какие есть)
2) скачать редистрибьютабл  с сайта майкрософт и установить (и 32-, и 64-битную версии)
3) запустить установку студии в дефолтовом составе компонентов (папку назначения можно изменить)
4) у меня после этого опять вылезли ошибки инсталляции, но другие, и было предложено перезагрузить комп. перезагрузил, запустил инсталляцию опять (так же дефолтовую) - установка прошла успешно
5) запустил инсталлятор опять, выбрал Modify, изменил состав  компонентов, как мне надо - процесс прошел успешно (на самом деле, еще идет, но уже очень блихок к завершению)

ОС - Windows 8 со всеми обновлениями, 64 бита