Получение типа объекта в Javascript, когда его прототипу назначен экземпляр другого объекта - PullRequest
0 голосов
/ 25 сентября 2011

У меня должно быть какое-то фундаментальное неправильное понимание того, как объекты работают в Javascript, потому что я не могу понять, почему следующий вывод выводит, что он делает.Здесь вы можете увидеть jsfiddle следующего кода: http://jsfiddle.net/VivekVish/8Qvkn/1/

Обратите внимание, что здесь используется определенная здесь функция getName: Как получить имя типа объекта в JavaScript?

Object.prototype.getName = function()
{ 
   var funcNameRegex = /function (.{1,})\(/;
   var results = (funcNameRegex).exec((this).constructor.toString());
   return (results && results.length > 1) ? results[1] : "";
};

function ContentProvider()
{

}

function LessonProvider()
{
    console.log(this.getName());
}

lessonProvider1 = new LessonProvider();
LessonProvider.prototype = new ContentProvider();
lessonProvider2 = new LessonProvider();

Приведенный выше код выводит на консоль следующее:

LessonProvider

ContentProvider

Но почему это не LessonProvider в обоих случаях и какможно ли сделать это LessonProvider в обоих случаях?

Ответы [ 2 ]

1 голос
/ 25 сентября 2011

Если вы не сбросите указатель на конструктор, все дочерние элементы сообщат, что родительский объект является их конструктором.

LessonProvider.prototype.constructor = LessonProvider;

Вы можете попробовать использовать для наследования функцию, подобную приведенной ниже:

function inherit(C, P) {
    //empty function used as a proxy
    var F = function() {};
    //set F's prototype equal to P's prototype
    F.prototype = P.prototype;
    //C will only inherit properties from the F's prototype
    C.prototype = new F();
    //set access to the parents (P's) prototype if needed
    C.uber = P.prototype;
    //Set the constructor back to C
    C.prototype.constructor = C;
}

inherit(LessonProvider, ContentProvider);
1 голос
/ 25 сентября 2011

если вы настаиваете -

LessonProvider.prototype = new ContentProvider()
LessonProvider.prototype.constructor=LessonProvider;
...