【发布时间】:2011-01-10 19:13:59
【问题描述】:
这可能会让您觉得这是一个语法不正确且可能很疯狂的问题,但我的意思是:当我试图理解 JavaScript 中 prototype 的概念时,我遇到了以下示例,它们或多或少有些复杂:
//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 似乎允许你做你本来不能做的事情,但我想不出你为什么想做这些事情的充分理由。
编辑:一些回应:
- 当我说“为什么要声明一个实例,然后再开始添加方法?”我更多地批评了我看到的所有示例,这些示例按照我的第一个示例的顺序进行。当这个顺序改变时,如下面的哈门回应,它确实在视觉上更有意义。然而,这并没有改变这样一个事实,就像我的第一个示例一样,您可以创建一个空对象函数构造函数,声明该对象的 100 个实例,然后再定义原始对象实际上是什么 通过
prototype为其提供方法和属性。也许这样做通常是为了暗示下面概述的复制与参考的想法。 - 基于几个回复,这是我的新理解:如果您将所有属性和方法添加到对象函数构造函数,然后创建该对象的 100 个实例,您将获得所有属性和方法的 100 个副本。相反,如果您将所有属性和方法添加到对象函数构造函数的
prototype,然后创建该对象的 100 个实例,您将获得 100 个 references 到对象的属性和方法。这显然更快、更有效,这就是为什么使用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');
【问题讨论】:
-
我为您的编辑更新了我的答案。
标签: javascript