javascript - JavaScript 中的私有(private)静态和继承

标签 javascript

我了解私有(private)静态机制在 javascript 中的工作原理;但是那拧紧了 遗产。 例如:

var Car = (function() {
    var priv_static_count = 0;
    return function() {
        priv_static_count = priv_static_count + 1;   
    }
})();
var SedanCar = function () {};
SedanCar.prototype = new Car();
SedanCar.prototype.constructor = SedanCar;

有什么办法可以避免这个陷阱吗?

最佳答案

首先,JavaScript 中没有“私有(private)静态”这样的东西。您在这里使用的是一个简单的闭包,它由 Immediately-Invoked Function Expression 创建。 .

你的问题不是很清楚,但我想你想计算创建的 Car 实例,但它不起作用,因为当你实例化子类时,计数器不会递增(问题 1)。相反,当您定义子类时,计数器只会增加一次(问题 2)。

由于 JavaScript 具有基于原型(prototype)的继承模型,因此您必须创建一个可用作原型(prototype)的对象。但我建议你不要调用父类的构造函数(这将解决问题的第二部分)。这是 JavaScript 世界中随处可见的一种非常常见的模式(参见 Simple JavaScript InheritanceBackboneCoffeScript 等),如果您不需要支持非常旧的浏览器(IE6),实现起来非常简单-8).它是这样的:

SedanCar.prototype = Object.create(Car.prototype)

现在问题的第一部分很容易解决。每次实例化子对象时调用父构造函数即可。这也是一个相当不错的模式,它被内置到许多其他语言(Java 等)中。在 JavaScript 中,您必须手动执行此操作,如下所示:

var SedanCar = function () {
    // Parent class initialization
    Car.call(this /*, and, other, arguments, to, the, parent, constructor */)

    // Child class initialization
};

这将使用绑定(bind)到新创建的对象的 this 调用父构造函数。父构造函数进行初始化,然后子构造函数完成它的工作。在您的示例中,父级将按照您的预期递增计数器。

关于javascript - JavaScript 中的私有(private)静态和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14475164/

相关文章:

javascript - 无法使用 Accounts.onCreateUser 添加用户属性

javascript - 如何替换这个组件WillReceiveProps?

javascript - 在 jQuery 中从被点击的父项中获取值

javascript - 使用 Three.js 加载纹理的 onProgress

javascript - 如何检查 Mongoose 中是否存在值

javascript - 也可以在另一个函数中使用在 select 标记中声明的 onchange 函数元素吗?

javascript - 选择特定的 css 动画帧

javascript - 在实体系统中存储组件

javascript - Angular ng-class(2个参数之间)

javascript - Electron/Node -使用require和readFile的代码片段使javascript失败