Невозможно получить доступ к методам, которые были добавлены через Prototype в объект Javascript.

0

У меня есть это объявление объекта внутри модуля Angular.js:

    $scope.test=function(){

    };

    $scope.test.prototype.push = function(data) {
        return data;
    };

И я называю это так:

var a = $scope.test.push(1);
console.error(a);

Но я получаю эту ошибку:

Error: undefined is not a function (evaluating '$scope.test.push(1)')

Почему я не могу получить доступ к методам, которые я добавил через Prototype для моего объекта?

1 ответ

1
Лучший ответ

Кажется, вы ошибаетесь в свойстве прототипа функции с внутренним прототипом объекта.

Соответствующая цитата из книги Eloquent Javascript:

Важно отметить различие между тем, как прототип связан с конструктором (через его свойство prototype) и тем, как объекты имеют прототип (который можно получить с помощью Object.getPrototypeOf). Фактическим прототипом конструктора является Function.prototype поскольку конструкторы являются функциями. Свойство prototype будет прототипом экземпляров, созданных через него, но не является его собственным прототипом.

Что это означает в контексте вашего примера кода:

$scope.test.prototype.push = function(data) {
    return data;
};

Здесь вы добавили функцию push для свойства $scope.test функции $scope.test, которая будет присутствовать в прототипе объектов, созданных с помощью этой тестовой функции в качестве функции-конструктора (с new ключевым словом).

$scope.test, однако, остается пустой функцией, которая не имеет .push(), что приводит к ошибке. Если вы хотите добавить метод push для каждой функции, вы можете использовать Function.prototype (обратите внимание, что Function - это конструктор, с помощью которого создаются новые функции), но я не уверен, где мы будем с этим.

  • 0
    я просто хотел добавить новый метод к этому объекту. я думал, что прототип - это путь, но сейчас я удаляю его, и код работает! $ scope.test.push = function (data) {... я не знаю, кстати, это правильный путь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню