无法访问通过Prototype添加到Javascript对象的方法

时间:2015-07-01 19:12:25

标签: javascript angularjs node.js

我在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 个答案:

答案 0 :(得分:1)

您似乎误将函数的原型属性与对象的内部原型混淆。

书籍Eloquent Javascript的相关引用:

  

重要的是要注意原型与构造函数关联的方式(通过其prototype属性)与对象具有原型的方式之间的区别(可以使用Object.getPrototypeOf)。构造函数的实际原型是Function.prototype,因为构造函数是函数。它的prototype 属性将是通过它创建的实例的原型,但不是它的自己的原型。

这在您的代码示例的上下文中意味着什么:

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

这里你已经为$scope.test函数的prototype属性添加了一个push函数,它将出现在使用这个测试函数作为构造函数创建的对象原型上({{1} }关键字)。

但是,

new仍然是一个空函数,它没有$scope.test方法,导致错误。如果要向每个函数添加一个push方法,可以使用Function.prototype(注意Function是用于创建新函数的构造函数),但我不知道我们要去哪里有这个。