javascript - 在命名空间内设置标准 JavaScript 原型(prototype)继承?

标签 javascript inheritance namespaces prototype-programming hoisting

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

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 的原型(prototype)和构造函数之后。我问这个是因为我试图从命名空间内执行此操作,而变量提升导致我的代码失败。举个例子:
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;

但是,我不知道是否有特定原因为什么大多数资源显示原始顺序而不是首先分配功能。

有人可以澄清一下吗?

谢谢!

最佳答案

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

例如:

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() {}

关于javascript - 在命名空间内设置标准 JavaScript 原型(prototype)继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6970333/

相关文章:

python - 多个租户的帐户管理

javascript - 在选项卡式 View 下,electron/javascript : node. js调用无法通过HTML脚本运行

c++ - 使用派生 [C++] 生成的参数初始化基类

c# - WCF 派生的 DataContract 不继承基础 DataContract 的属性

c++ - STL算法函数名解析

grails - 访问服务中的标签库

javascript - 如何从geojson openlayers3获取图像源

javascript - css 随机修复 JS 和多个 div

javascript - Angularjs uib modal无法调用模态 Controller

mysql - SQL 数据库中的非规范化或规范化(继承数据)