将函数直接赋值给构造函数与它的原型有什么区别,为什么?

时间:2014-01-27 04:43:55

标签: javascript inheritance constructor prototype

请原谅我的术语。我不明白之间的区别:

function Person() {};
Person.walk = function() {};

和...

function Person() {};
Person.prototype.walk = function() {};

似乎第二种方式是构造函数的约定,但我不明白它的区别以及为什么这样做。谢谢!

3 个答案:

答案 0 :(得分:3)

在第一种情况下:

function Person() {};
Person.walk = function() {};

您只能通过以下方式调用该功能:

Person.walk();

如果您创建Person的实例,则无法调用该方法:

p = new Person();
p.walk() // -> TypeError: Object #<Person>  has no method 'walk'

另一方面,如果您使用原型,您将只能通过实例调用该方法。

答案 1 :(得分:1)

第一个函数与该构造函数的对象实例没有关系,您可以将其视为'静态方法'。

第二个函数,在扩展构造函数原型时,它将可用于使用new关键字创建的所有对象实例

示例:

// constructor function

function MyClass () {
  var privateVariable; // private member only available within the constructor fn

  this.privilegedMethod = function () { // it can access private members
  //..
  };
}

// A 'static method', it's just like a normal function 
// it has no relation with any 'MyClass' object instance
MyClass.staticMethod = function () {};

MyClass.prototype.publicMethod = function () {
// the 'this' keyword refers to the object instance
// you can access only 'privileged' and 'public' members
};

var myObj = new MyClass(); // new object instance

myObj.publicMethod();
MyClass.staticMethod();

答案 2 :(得分:1)

与构造函数不同,原型是用于创建实例的模板。请注意,原型的成员实际上并未复制到实例,而是实例在原型的资源上绘制,除非该资源已由实例拥有。

var Class = function () {};
Class.prototype.a = 1;
Class.prototype.b = 2;

// creates a new instance named "c"
var c = new Class();
c.b = 3;

console.log(
    c.hasOwnProperty('a'), // -> false
    c.hasOwnProperty('b'), // -> true
    c.a, // -> 1 (prototype)
    c.b, // -> 3 (instance)
    Class.prototype.b // -> 2 (prototype)
);