после этого поста еще доразбирался - можно тут посмотреть
есть дедовский способ наследования через прототипы:
у каждой функции есть свойство prototype. Смысл его - в том, что при вызове функции с ключевым словом new - создается объект, а функция выступает в качестве его конструктора (и может использовать указатель this). так вот, если у этого объекта запросить поле (в т.ч. , функцию), которое не было в нем инициализировано - это поле будет искаться в объекте, на который ссылается внутренний (недоступный программисту) указатель [[prototype]]. А указатель этот указывает на объект, который был в свойстве prototype функции-конструктора на момент вызова оператора new.
и можно в свойство prototype функции-конструктора вписать просто объект с полями.
а можно в качестве прототипа вписать созданный через new объект класса-предка.
следует заметить, что, даже если вызывается функция, являющаяся членом прототипа - в качестве this к ней приходит указатель на созданный через new объект, а не на объект, который лежит в [[prototype]].
минус подхода - в том, что у родительского класса не может быть параметров конструктора
сейчас этот подход считается устаревшим. вместо него нужно использовать метод object.Create(его поддерживает даже IE9, вроде, так что можно уже использовать), который позволяет делать всякие навороты типа полей только для чтения и свойств с геттерами и сеттерами.
http://www.htmlgoodies.com/beyond/javascript/object.create-the-new-way-to-create-objects-in-javascript.html
но я не стал заморачиваться и изучать, думаю, пока и дедовского способа хватит
дополнение:
описанный выше способ наследования - прототипный.
а есть еще прием, который называется функциональным наследованием:
не используется ключевое слово this (говорят, с ним может быть гемор), можно использовать параметры конструктора... хороший способ!
http://julien.richard-foy.fr/blog/2011/10/30/functional-inheritance-vs-prototypal-inheritance/
есть дедовский способ наследования через прототипы:
у каждой функции есть свойство 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/
Комментариев нет:
Отправить комментарий