我想知道使用其中任何一个是否有任何优势,我应该走哪条路?
构造方法:
var Class = function () { this.calc = function (a, b) { return a + b; }; };
原型方法:
var Class = function () {}; Class.prototype.calc = function (a, b) { return a + b; };
我不喜欢这样,使用原型,方法定义与类分开,我不知道是否有任何具体原因我应该使用它而不是第一种方法。
此外,使用函数文字来定义“类”有什么好处,而不仅仅是函数定义:
var Class = function () {};
对比
function Class () {};
谢谢!
通过原型链继承的方法可以针对所有实例进行通用更改,例如:
function Class () {} Class.prototype.calc = function (a, b) { return a + b; } // Create 2 instances: var ins1 = new Class(), ins2 = new Class(); // Test the calc method: console.log(ins1.calc(1,1), ins2.calc(1,1)); // -> 2, 2 // Change the prototype method Class.prototype.calc = function () { var args = Array.prototype.slice.apply(arguments), res = 0, c; while (c = args.shift()) res += c; return res; } // Test the calc method: console.log(ins1.calc(1,1,1), ins2.calc(1,1,1)); // -> 3, 3
请注意如何更改应用于两个实例的方法?这是因为ins1和ins2共享相同的calc()功能。为了使用构建期间创建的公共方法执行此操作,您必须将新方法分配给已创建的每个实例,这是一项尴尬的任务。这是因为ins1并且ins2会有自己的、单独创建的calc()功能。
ins1
ins2
calc()
在构造函数中创建方法的另一个副作用是性能较差。每次构造函数运行时都必须创建每个方法。原型链上的方法创建一次,然后由每个实例“继承”。另一方面,公共方法可以访问“私有”变量,而继承方法则无法做到这一点。
至于你的function Class() {}vsvar Class = function () {}问题,前者在执行前被“提升”到当前范围的顶部。对于后者,变量声明被提升,但不是赋值。例如:
function Class() {}
var Class = function () {}
// Error, fn is called before the function is assigned! fn(); var fn = function () { alert("test!"); } // Works as expected: the fn2 declaration is hoisted above the call fn2(); function fn2() { alert("test!"); }