JavaScript中的原型是什么?

JavaScript中的原型是什么?,javascript,class,prototype,Javascript,Class,Prototype,什么是JavaScript类的原型?换句话说,两者之间的区别是什么 Example.prototype.method {} 及 在定义示例类时 编辑:对于那些感兴趣的人,我在这里找到了一个很好的解释(除了下面的答案之外),解释了类方法和构造函数方法之间的区别: 编辑2:完整答案 原型类似于类定义,但可以动态更改。每当您实例化某一类型的对象时,它都会使用原型作为模板 如果您更改原型,则该类型的对象将发生这些更改。区别在于后一个示例中您正在创建一个静态方法,如果example是一个构造函数,则不会

什么是JavaScript类的原型?换句话说,两者之间的区别是什么

Example.prototype.method {}

在定义示例类时

编辑:对于那些感兴趣的人,我在这里找到了一个很好的解释(除了下面的答案之外),解释了类方法和构造函数方法之间的区别:


编辑2:完整答案

原型类似于类定义,但可以动态更改。每当您实例化某一类型的对象时,它都会使用原型作为模板


如果您更改原型,则该类型的对象将发生这些更改。

区别在于后一个示例中您正在创建一个静态方法,如果
example
是一个构造函数,则不会继承该方法。通过在构造函数的
prototype
属性中定义属性并使用
new
关键字创建对象,新创建的对象继承构造函数的原型,从而可以访问这些方法

例如,内置核心构造函数中定义的方法,例如
String
。。新创建的字符串有一个
indexOf
方法,因为在
String
函数构造函数的原型中定义了一个方法

typeof String.prototype.indexOf // 'function'

var name = 'John';
alert( name.indexOf('J') ) // 0
下面的代码创建了一个函数构造函数,我们首先定义了一个静态方法,创建了一个对象,发现这个对象没有getName方法,然后我们在原型中定义了一个,发现现在这个对象有了getName方法

function Name(name) {
    this.name = name;
};
Name.getName = function(){};

var john = new Name();
typeof john.getName // undefined

var john = new Name();
Name.prototype.getName = function(){ alert( this.name )};
typeof john.getName

john.constructor.prototype.getName == john.getName // true
因此,重申一下,ECMAScript中的继承主要是通过在函数构造函数的原型中定义属性/方法来实现的,例如所有的核心构造函数,如Date/Number/String,它们在各自的原型属性中定义了方法,它允许您在使用
new
关键字创建实例时使用这些方法

请记住,新创建的对象有一个
构造函数
属性,该属性指向创建它的构造函数,我们可以直接访问
原型
属性。我们创建的
john
对象并不直接拥有
getName
方法,因为解释器无法直接在对象上找到它,它向上移动到构造函数并在其原型中找到它

顺便说一句,我们实际上不必创建
john
对象的新实例,正如另一个答案所指出的,在创建初始构造函数之后,您可以在原型中定义属性,并且所有对象都将继承这些原型属性,即使它们已经创建

静态方法不能依赖上下文,不能依赖类的特定实例,不能依赖
this
关键字,因此这不是静态方法:

function Name(name) {
    this.name = name;
    this.getName = function() { return this.name; }
};
Name.getName = function() {};
这是一个静态方法的示例:

function Name(name) {
    this.name = name;
    this.getName = function() { return this.name; }
};
Name.getName = function() {};

但是将
getName
设置为静态毫无意义,因为顾名思义,它必须依赖对象实例来确定name属性是什么,您应该有更多的通用帮助函数,如解析函数,如
Date.parse
,作为静态方法,并在原型中定义实例方法,因为它们比在构造函数中定义
this.foo=function(){}
更有效,我什么时候可以在不使用原型定义的情况下为Name类定义方法(以及如何定义?
getName
将是一个公共方法,因此您可以在原型上定义它,而不是静态地定义它,如果没有将其公开或在原型中的目的,您可以定义静态方法。我想我的问题是,在上面的示例中,您如何定义静态方法,为什么要这样做而不是定义实例方法?您在创建构造函数后定义了它,但说它未定义(第二个代码块的第7行)。如果函数中有东西的话,那就行了?