调用添加到函数原型

时间:2015-08-02 06:27:50

标签: javascript knockout.js

我目前对function.prototype感到困惑。我见过这种类型的代码:

define([], function() {
    function HomeViewModel(route) {
        this.message = ko.observable('Welcome to Home!');
        }

        HomeViewModel.prototype.doSomething = function() {
            this.message('You invoked doSomething() on the viewmodel.');
        };

        return HomeViewModel;
    }
}

我们如何在函数原型中添加函数?我也在这里做了一些阅读:Function.protoype。在Description部分中,它声明:

  

函数对象继承自Function.prototype。无法修改Function.prototype。

但上面的代码看起来就像是在函数原型中添加了一个函数。我已经过测试,上面的代码返回函数HomeViewModel()。那么如何从返回值或实际函数之外调用 HomeViewModel.prototype.doSomething

1 个答案:

答案 0 :(得分:3)

不同之处在于 function Function之间的大小写:在Javascript中,你绝对可以在函数中添加方法'原型,你只是不能将方法添加到Function.prototype - Function作为"基类"使用名称​​ Function ,其中包含许多内置方法,所有功能共享。

如果向对象原型添加方法,则可以像调用构造函数中添加的方法一样调用它:

function Test() {
  this.myMethod = function() {
    return true;
  }
}

t = new Test();
t.myMethod();

将一个方法添加到原型中:

function Test() {
}

Test.prototype.myMethod = function() {
  return true;
}

t = new Test();
t.myMethod();

那么差异在哪里呢?如果在构造函数中添加方法,则从该构造函数创建的每个对象都会获得该方法的唯一副本:

function Test() {
  this.myMethod = ko.observable();
}

a = new Test();
b = new Test();
a.myMethod('foo');
b.myMethod(); // returns undefined

另一方面,添加到原型的方法是在从该构造函数创建的所有对象之间 shared

function Test() {
}

Test.prototype.myMethod = ko.observable();

a = new Test();
b = new Test();
a.myMethod('foo');
b.myMethod(); // returns 'foo'