通过原型链继承的方法可以对所有实例进行通用更改,例如:
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()
在构造函数中创建方法的另一个副作用是性能较差。每次运行构造函数时都必须创建每个方法。原型链上的方法创建一次,然后由每个实例“继承”。硬币的另一面,公共方法可以访问“私有”变量,这对于继承的方法是不可能的。
至于你的vs问题,前者在执行之前被“吊”到当前范围的顶部。对于后者,将提升变量声明,但不提升赋值。例如: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!"); }