суббота, 26 ноября 2016 г.

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

начал разбираться здесь

сейчас еще подумал еще на эту тему, и написал пример (он ниже).
там для эмуляции наследования используется только prototype. не используется object.create и прочие новомодные штучки, все "ближе к земле". синтаксис немного упростится, если использовать Object.Create (не понадобились бы функции типа A_Proto).
А еще недавно в JS появился синтаксис объявления классов, более-менее похожий на используемый в объектно-оринентированных языках, с использованием ключевого слова "class". однако, нет поддержки этого синтаксиса, например, в IE 11. то есть, на мой взгляд, использовать это пока рановато.


var A = function(initPropA, noConstructor){
 this.ConstructorA(initPropA);
};
var A_Proto = function(){
 this.propA = null; //для порядка
 this.ConstructorA = function(initPropA){
  console.log("ConstructorA");
  this.propA = initPropA;
 };
 this.fA = function(){
  console.log("fA");
 };
 this.virtF = function(param){
  console.log("virtFA: " + this.propA + "; " + param)
 };
}
A.prototype = new A_Proto();


var B = function(initPropB, initpropA){
 this.ConstructorB(initPropB, initpropA);
}

var B_Proto = function(){
 this.propB = null;
 this.ConstructorB = function(initPropB, initpropA){ //конструктор класса-потомка вызывает конструктор предка, а потом производит свою инициализацию
  this.ConstructorA(initpropA);
  console.log("ConstructorB");
  
  if (this.propA % 2 == 0)
   this.propA++;
  this.propB = initPropB;
 };
 
 this.fB = function(){
  console.log("fB");
 };
 
 this.ShowPropB = function(){
  console.log(this.propB);
 }
   
 this.virtF = function(param){
  console.log("virtFB: " + this.propB+ "; " + param);
  A.prototype.virtF.call(this, param); //вызов версии метода базового класса
 };
}
B_Proto.prototype = new A_Proto();
B.prototype = new B_Proto();


var C = function(){
 this.ConstructorC();
}

var C_Proto = function(){
 this.ConstructorC = function(){
  this.ConstructorB(123, 456);
  console.log("ConstructorC");
 }
 
 this.fC = function(){
  console.log("fC");
  this.ShowPropB();
 };
 
 this.virtF = function(param){
  console.log("virtFC: " + param);
  B.prototype.virtF.call(this, param); //вызов версии метода базового класса
 };
}
C_Proto.prototype = new B_Proto();
C.prototype = new C_Proto();

console.log("***A***");
var a = new A(222);
console.log(a.propA);
a.fA();
a.virtF("a_param");

console.log("***B***");
var b = new B(777, 222);
console.log(b.propA);
console.log(b.propB);
b.fA();
b.fB();
b.virtF("b_param");

console.log("***C***");
var c = new C();
console.log(c.propA);
console.log(c.propB);
c.fA();
c.fB();
c.fC();
c.virtF("c_param");
Аутпут:

***A***
inheritance.html
ConstructorA
inheritance.html
222
inheritance.html
fA
inheritance.html
virtFA: 222; a_param
inheritance.html
***B***
inheritance.html
ConstructorA
inheritance.html
ConstructorB
inheritance.html
223
inheritance.html
777
inheritance.html
fA
inheritance.html
fB
inheritance.html
virtFB: 777; b_param
inheritance.html
virtFA: 223; b_param
inheritance.html
***C***
inheritance.html
ConstructorA
inheritance.html
ConstructorB
inheritance.html
ConstructorC
inheritance.html
457
inheritance.html
123
inheritance.html
fA
inheritance.html
fB
inheritance.html
fC
inheritance.html
123
inheritance.html
virtFC: c_param
inheritance.html
virtFB: 123; c_param
inheritance.html
virtFA: 457; c_param

вторник, 22 ноября 2016 г.

Visual Studio 2013 закапризничала опять: ошибка HTTP 500.19

мое Asp.net-MVC-приложение хранится в git. И для удобства у меня есть несколько рабочих папок с разными ветками этого репозитория. и я достаточно свободно копирую и переименовываю эти папки.
Но сегодня - не знаю, связаны ли эти два факта, или нет - после очередного переименования/копирования папки и запуска приложения я увидел такой экран:

получается, IIS Express ищет web.config по старому пути папки (я переименовал папку kaspihelp2)

настройки отладки  меня были примерно такие (они стоят по дефолту при создании проекта, но настроенаа подпапка):
 
что я только не делал! даже компьютер перезагрузил! :)
по идее, следующим шагом была переустановка Студии (моему коллеге помогло в аналогичной ситуации).
Но в итоге проблема была устранена просто инкрементом номера порта :)
 
не забудьте ткнуть «Create Virtual Directory» (я не до конца разобрался, что это, но, вроде, не лишне)

среда, 9 ноября 2016 г.

Добавление глобального Html-хелпера


Есть проект Asp.net mvc (не знаю, как версию посмотреть, воздан в Visual Studio 2013)
Встала задача создать Html-хелпер, глобально доступный для всех cshtml-видов проекта
Написал класс вида:
namespace Aproject.Helpers
{
    public static class WebHelpers
    {
        public static string GetDateString(this HtmlHelper helper, DateTime date)
        {
            return date.ToLongDateString();
        }
    }
}
в cshtml-файле вида:
добавил сверху:
@using Aproject.Helpers
после этого смог использовать мой метод:
@Html.GetDateString(Model.Date)

но хотелось избавиться от необходимости перечислять в начале страницы все юзинги.
какое-то время ковырялся в гугле, в итоге выяснил:
нужно в Web.Config, который лежит в папке Views, в секцию
<pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
добавить ссылку на наше пространство имен.
Но и это еще не все! чтобы IntelliSence одуплился, нужно закрыть и открыть проект (я просто закрыл и переоткрыл вижуал-студию). Пока этого не сделаешь, всё, объявленное в этих пространствах имен, будет подчеркнуто красным.