JavaScript中的原型是什么?

Ton*_*ark 7 javascript prototype class

什么是JavaScript类的原型?换句话说,有什么区别

Example.prototype.method {}
Run Code Online (Sandbox Code Playgroud)

Example.method{}
Run Code Online (Sandbox Code Playgroud)

在定义Example类时?

编辑:对于那些感兴趣的人,我在这里找到了一个很好的解释(除了下面的答案),这里有类方法和构造方法之间的区别:http://idhana.com/2009/07/13/constructor-vs-class-方法合的JavaScript /

编辑2:完整答案!http://blog.anselmbradford.com/2009/04/09/object-oriented-javascript-tip-creating-static-methods-instance-methods/

med*_*iev 5

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

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

typeof String.prototype.indexOf // 'function'

var name = 'John';
alert( name.indexOf('J') ) // 0
Run Code Online (Sandbox Code Playgroud)

下面的代码创建了一个函数构造函数,我们首先定义一个静态方法,创建一个对象,找出该对象没有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
Run Code Online (Sandbox Code Playgroud)

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

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

顺便说一下,我们并没有真正创建john对象的新实例,正如另一个答案中所指出的那样,您可以在创建初始构造函数后在原型中定义属性,并且所有对象都会继承这些原型属性,即使它们'已被创建.

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

function Name(name) {
    this.name = name;
    this.getName = function() { return this.name; }
};
Run Code Online (Sandbox Code Playgroud)

这将是一个静态方法的示例:

Name.getName = function() {};
Run Code Online (Sandbox Code Playgroud)

但是在制作getName静态时绝对没有意义,因为顾名思义它必须依赖于一个对象实例来确定name属性是什么,你应该有更多通用的辅助函数,比如解析函数,Date.parse如静态方法和定义原型中的实例方法因为它们比this.foo = function(){}在构造函数中定义更有效.