这可能会让你觉得这是一个语法不正确且可能是疯狂的问题,但我的意思是:在尝试理解prototype
JavaScript 中的概念时,我遇到了一些或多或少复杂版本的示例:
//Guitar function constructor
function Guitar(color, strings) {
this.color = color;
this.strings = strings;
}
//Create a new instance of a Guitar
var myGuitar = new Guitar('Black', ['D', 'A', 'D', 'F', 'A', 'E']);
//Adding a new method to Guitar via prototype
Guitar.prototype.play = function (chord) {
alert('Playing chord: ' + chord);
};
//Now make use of this new method in a pre-declared instance
myGuitar.play('D5');
那么,回到我的问题:你到底为什么要这样做?你为什么不直接把这个play
函数放进Guitar
去呢?为什么先声明一个实例,然后再开始添加方法?我能看到的唯一原因是您是否不想myGuitar
访问play
它最初创建的时间,但我无法举出任何示例来阐明您为什么想要这样的东西的原因。
这样做似乎更有意义:
function Guitar(color, string) {
this.color = color;
this.strings = strings;
this.play = function (chord) {
alert('Playing chord: ' + chord);
};
}
var myGuitar = new Guitar('White', ['E', 'A', 'D', 'G', 'B', 'E']);
myGuitar.play('E7#9');
这里真正的问题是,第二个例子对我来说有意义,而第一个例子没有,而实际上,由于某些原因,第一个例子可能更好。不幸的是,我发现的每个教程都只是经历了使用步骤,prototype
而不是为什么prototype
范式一开始就存在。
这似乎可以prototype
让您做原本无法做的事情,但我想不出很好的理由来说明您为什么想做这些事情。
编辑:一些回应:
- 当我说“为什么先声明一个实例然后再开始添加方法?” 我更多地批评了我看到的所有示例,这些示例按照我的第一个示例的顺序进行。当这个顺序改变时,就像下面 Harmen 的回应一样,它在视觉上确实更有意义。然而,这并没有改变,在同样作为我的第一个例子,你可以创建一个空的目标函数构造的事实,声明此对象的100个实例,然后事后才定义一下原来的对象实际上是给它方法和属性通过
prototype
. 也许这样做通常是为了暗示下面概述的复制与参考的想法。 - 根据几个回复,我的新理解是:如果将所有属性和方法添加到对象函数构造函数中,然后创建该对象的 100 个实例,您将获得所有属性和方法的 100 个副本。相反,如果您将所有属性和方法添加到
prototype
对象函数构造函数的 ,然后创建该对象的 100 个实例,您将获得对对象属性和方法的单个 (1) 副本的100 个引用。这显然更快,更有效,这prototype
就是使用的原因(除了改变String
和 之类的东西Image
,如下所述)。那么,为什么不这样做:
(显然,项目符号列表会在它们之后立即破坏任何代码,因此我必须在此处添加一行单独的文本)
function Guitar(color, strings) {
this.prototype.color = color;
this.prototype.strings = strings;
this.prototype.play = function (chord) {
alert('Playing chord: ' + chord);
};
}
var myGuitar = new Guitar('Blue', ['D', 'A', 'D', 'G', 'B', 'E']);
myGuitar.play('Dm7');