在命名空间内设置标准的JavaScript原型继承?

时间:2011-08-07 02:27:57

标签: javascript inheritance namespaces prototype-programming hoisting

JavaScript中的标准原型继承如下:

function Animal() {
    this.legs = 0;
}
Animal.prototype.move = function () {
    alert("I'm moving!");
}

Bird.prototype = new Animal();
Bird.prototype.constructor = Bird;
function Bird() {
    this.legs = 2;
    this.wings = 2;
}
Bird.prototype.move = function () {
    alert("I'm flying!");
}

Bird的函数定义是否必须在分配Bird的原型和构造函数之后。我问这个是因为我试图在命名空间内执行此操作,并且变量提升导致我的代码失败。举个例子:

var namespace = {};
namespace.Animal = function () {
    this.legs = 0;
};
namespace.Animal.prototype.move = function () {
    alert("I'm moving!");
};

namespace.Bird.prototype = new namespace.Animal();
namespace.Bird.prototype.constructor = namespace.Bird;
namespace.Bird = function () {
    this.legs = 2;
    this.wings = 2;
};
namespace.Bird.prototype.move = function () {
    alert("I'm flying!");
};

感谢提升namespace.Bird.prototype赋值语句和namespace.Bird.prototype.constructor赋值语句失败。如果我将namespace.Bird函数赋值移动到这两行之上,如下面的代码块所示,那么代码似乎可以工作。

namespace.Bird = function () {
    this.legs = 2;
    this.wings = 2;
};
namespace.Bird.prototype = new namespace.Animal();
namespace.Bird.prototype.constructor = namespace.Bird;

但是,我不知道大多数资源是否显示原始订单的具体原因,而不是将功能分配放在第一位。

有人可以澄清一下吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

原因与函数的分析时可用性和函数的运行时可用性有关。

例如:

var afunc = asdf;
function asdf(){} 

相同
function asdf(){} 
var afunc = asdf;

但是,

var afunc = asdf;
var asdf = function(){};

不同
var asdf = function(){};
var afunc = asdf;

这有道理吗?

此外,这个问题的答案可能会对你有帮助

var functionName = function() {} vs function functionName() {}