【发布时间】:2013-05-20 22:17:30
【问题描述】:
最近我开始学习 Javascript,因为我来自 Java 世界。我得到了这本书,名为JavaScript The Definitive guide.。我现在对原型和继承有点困惑。我想知道将函数设置为对象属性和函数原型有什么区别。来自书中的例子:
function Rectangle(w, h) {
this.width = w;
this.height = h;
this.area = function( ) { return this.width * this.height; }
}
使用这个新版本的构造函数,您可以编写如下代码:
// How big is a sheet of U.S. Letter paper in square inches?
var r = new Rectangle(8.5, 11);
var a = r.area( );
这个解决方案效果更好,但仍然不是最优的(为什么)。创建的每个矩形都会有 三个属性(是的,那又怎样?)。每个的宽度和高度属性可能不同 矩形,但每个 Rectangle 对象的面积总是指同一个 函数(当然,有人可能会更改它,但您通常打算使用这些方法 一个对象是恒定的)。对方法使用常规属性是低效的 旨在由同一类的所有对象共享(为什么???有什么问题?)(即所有对象 使用相同的构造函数创建)。
【问题讨论】:
-
在这种情况下,我应该将 area 定义为原型: Rectangle.prototype.area=function()... 这样所有 Recangle 共享相同的函数,因为 Rectangle 的计算面积总是相同的,这是一个好东西。当 with 或 height 发生变化时,调用 area 确保始终返回正确的值。您可以在创建对象时设置面积,但是您必须为 with 和 height 创建 getter 和设置,以便在更改其中任何一个时重新计算面积。
-
如果你想了解原型如何工作以及如何从函数创建对象实例而不是尝试运行此代码:stackoverflow.com/questions/16063394/… 我建议使用带有 firebug 插件的 Firefox 或 Chrome,你可以复制和粘贴代码在控制台中运行它,而无需每次都重新加载页面。
-
@HMR:SO 上已经有一个“参考”答案:stackoverflow.com/questions/1595611/…
-
我发布的链接是针对那些试图了解原型如何工作的人(基本)。您发布的链接是一个很好的完整参考,但在开始时很难消化。更完整一点是 goog.inherits docs.closure-library.googlecode.com/git/… 这将设置 childs superClass_ 当您想在使用 goog.base 覆盖父函数时调用父函数(在同一页面上)
-
@zerkms +1 感谢您提供链接。用_init解决参数化构造函数的好方法,goog.inherit需要你自己调用Parent.call或Parent.apply。
标签: javascript