我们使用什么样式来创建"类"?
时间:2020-03-05 18:38:42 来源:igfitidea点击:
有几种方法可以在javascript中获得类的行为,最常见的方法似乎是基于原型的,如下所示:
function Vector(x, y, x) { this.x = x; this.y = y; this.z = z; return this; } Vector.prototype.length = function () { return Math.sqrt(this.x * this.x ... ); }
和基于封闭的方法类似于
function Vector(x, y, z) { this.length = function() { return Math.sqrt(x * x + ...); } }
出于各种原因,后者速度更快,但是我已经看到(并且我经常写)原型版本,并对其他人的操作感到好奇。
解决方案
回答
好吧,我对此没有真正的专家意见。
我通常最终使用基于闭包的方法,只是因为它使代码更易于管理。但是,我发现自己将原型用于具有大量代码行的方法。
回答
我们还可以选择:
function Vector(x, y, z) { function length() { return Math.sqrt(x * x + ...); } }
可能和示例2一样慢,但是看起来更像Java / Cand。
回答
将功能分配给原型更好(对于公共方法),因为该类的所有实例将共享该方法的相同副本。如果像第二个示例一样在构造函数内部分配函数,则每次创建新实例时,构造函数都会创建一个新的length函数副本,并将其仅分配给该实例。
但是,如果我们希望每个副本都有自己的副本,则后一种技术很有用,该方法的主要用途是执行私有/特权方法,这些方法可以访问在构造函数中声明并通过闭包机制继承的私有变量。
道格拉斯·克罗克福德(Douglas Crockford)有一个不错的总结。
回答
幸运的是,我可以使用prototype.js,它提供了一些不错的包装器。因此,我们可以执行以下操作:
var Person = Class.create({ initialize: function(name) { this.name = name; }, say: function(message) { return this.name + ': ' + message; } });
Prototype.js
文档:定义类和继承
回答
原型还有对象文字方法:
var Vector = function(){}; Vector.prototype = { init:function(x,y,z) { this.x = x; this.y = y; this.z = z; }, length:function() { return Math.sqrt(x * x + ...); } }; var v1 = new Vector(); v1.init(1,2,3);
回答
我非常喜欢为此使用John Resig的库。轻巧,直接,如果我们熟悉"通常"的面向对象样式,我们已经知道如何使用它。