我正在阅读一段定义构造函数的代码片段
var Resource = function(data) {
angular.extend(this, data);
}
然后定义一个方法。
Resource.query = function(url) {
console.log(url);
}
请问这是如何工作的?我知道函数也是对象,这是否等同于以下内容?但如果是这样,那么构造函数会发生什么?
var data = {};
data.query = function(url) {
console.log(url);
}
另外,为什么我们不能简单地在原型上定义它?
Resource.prototype.query = function(url) {
console.log(url);
}
答案 0 :(得分:2)
只有在特定实例上调用方法时,才会在prototype
上定义方法。当方法直接定义为构造函数成员时,通常会模仿static方法。
基本上,当一个方法与类非常接近时,但作为一个实例方法没有多大意义,它可以作为静态方法实现。
我认为你会同意我的说法,第二个例子更有意义,如果你这样做,你已经明白了它的区别。
1 -
var user = new User();
user.findUser('somequery').then(...);
2 -
User.findUser('somequery').then(...);
答案 1 :(得分:1)
我知道函数也是对象,这相当于以下
你说的没什么。它就像任何其他对象上的任何其他属性一样。
另外,为什么我们不能简单地在原型上定义它呢?
不同之处在于,使用构造函数创建的每个对象将在其原型链中具有该方法。对于构造函数本身定义的属性,情况并非如此。
那是:
var Resource = function() {}
Resource.one = function() {
console.log("one");
}
Resource.prototype.two = function() {
console.log("two");
}
var r = new Resource();
r.two(); // => "two"
r.one(); // => TypeError: r.one is not a function
和
Resource.one(); // => "one"
Resource.two(); // => TypeError: Resource.two is not a function
您可以将one
称为静态方法,但该语言不会以不同于任何其他函数的方式对待它(与使用Java中的static
定义的方法不同)。