У меня есть это объявление объекта внутри модуля 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
для моего объекта?
Кажется, вы ошибаетесь в свойстве прототипа функции с внутренним прототипом объекта.
Соответствующая цитата из книги 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 - это конструктор, с помощью которого создаются новые функции), но я не уверен, где мы будем с этим.