среда, 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/

Комментариев нет:

Отправить комментарий