javascript中的构造函数和原型

时间:2014-03-09 03:44:37

标签: javascript angularjs

我正在阅读一段定义构造函数的代码片段

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);
}

http://jsfiddle.net/HPg6A/

2 个答案:

答案 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定义的方法不同)。