【问题标题】:Can't access to methods that added via Prototype to Javascript object无法访问通过原型添加到 Javascript 对象的方法
【发布时间】:2015-07-02 03:27:22
【问题描述】:

我在 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 添加到我的对象的方法?

【问题讨论】:

  • test 可以从您使用 test 作为构造函数创建的对象访问,而不是从函数对象本身访问,除非您使用 $scope.test.prototype.push(1);,这很奇怪。如果你愿意,你可以将push 函数直接添加到$scope.test 函数中,但我不确定你到底想要什么。
  • 你可能想要var a = new $scope.test.push(1);,如果是这样,约定是用大写字母命名Test

标签: javascript angularjs node.js


【解决方案1】:

您似乎将函数的原型属性误认为是对象的内部原型。

来自Eloquent Javascript一书的相关引用:

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

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

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

在这里,您已向 $scope.test 函数的原型属性添加了一个 push 函数,该函数将出现在使用此测试函数作为构造函数(使用 new 关键字)创建的对象的原型上。

$scope.test,然而,仍然是一个空函数,它没有.push() 方法,导致错误。如果你想为 every 函数添加一个 push 方法,你可以使用 Function.prototype (注意 Function 是创建新函数的构造函数),但我不确定我们要去哪里有了这个。

【讨论】:

  • 我只是想为该对象添加新方法。我在想原型是方法,但现在我删除它并且代码工作! $scope.test.push = function (data) {... 顺便说一句,我不知道这是正确的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
相关资源
最近更新 更多