我目前对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 ?
答案 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'