请原谅我的术语。我不明白之间的区别:
function Person() {};
Person.walk = function() {};
和...
function Person() {};
Person.prototype.walk = function() {};
似乎第二种方式是构造函数的约定,但我不明白它的区别以及为什么这样做。谢谢!
答案 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)
);