使用模块全局作用域定义可从prototype访问的私有类字段
use module global scope to define private class fields accessible from prototype
如果一个构造函数和它的原型是在同一模块中定义的,说AMD模块,它是可以接受的,使类私有字段全局的模块是可访问的原型,而不是用下划线在构造函数中定义它们?
这样更好吗?
define(function (require) {
"use strict";
var steps = 0;
function Constructor(_steps) {
steps = _steps;
}
Constructor.prototype.go = function () {
steps += 1;
};
然后:
define(function (require) {
"use strict";
function Constructor(_steps) {
this._steps = _steps;
}
Constructor.prototype.go = function () {
this._steps += 1;
};
?
TL;DR:这并不重要(这只是一个很小的实现细节)
两种不同的解决方案。一个不一定比另一个"更好",它们只是有不同的用例。
如果您使用构造函数/原型模式,那么在面向对象的意义上,在实例本身(使用this.<whatever-prop>
)上设置构造函数参数是有意义的。当您决定仅为了的副作用而使用构造函数时(通过根据传递给构造函数的参数设置someModuleVariable
),可能会不必要地混淆代码。
唯一让我感到不舒服的是只为了它的副作用而使用构造函数…当构造函数的主要目的之一是隐式设置实例上的属性时,我为什么要使用构造函数呢?
为了区分这两个想法,一个常见的模式是在原型内部使用init
方法,因为是容纳所有期望的副作用的好地方。例如,可以建议这样做:
var Module = (function() {
var somethingPrivate;
function SomeObject(someProp) {
// rely on the constructor to set instance properties
this.someProp = someProp;
}
SomeObject.prototype = {
init: function(_somethingPrivate) {
// all of your side effects in here, such as:
somethingPrivate = _somethingPrivate;
}
};
return SomeObject;
}());
var module = new Module('Hello world! I belong to the instance');
module.init('I am a module-specific variable!');
当然,这并不是说在任何情况下都不需要依赖构造函数来处理它的副作用。但是在你给出的例子中,它甚至看起来不像一个构造函数是必要的(尽管我理解这个例子只是为了演示问题而设计的)。
在哪里以及如何使用_
下划线是不相关的,只是作为旁注。它们在某些情况下很好,比如区分伪私有属性和"公共"属性,但我认为这更像是一种惯例,而不是一种固定不变的模式。
相关文章:
- 如何访问对象内部的“categoryIds”字段/键,该对象包含mongodb's `ObjectId(s)`数
- 飞行前响应中的访问控制允许标头不允许Angularjs请求标头字段访问控制允许标题
- MVC+访问控制器中的隐藏字段
- ReactJS表单提交如何访问字段值
- 访问KendoUI中Datasource过滤对象的字段
- 表单级别的Anguarjs指令,访问所有字段并检查验证
- 循环访问文档 (validate_doc_update) 中的 CouchDB 字段
- 在 Java 中访问 JavaScript 对象的字段
- 如何在 for 循环中访问 json 数组字段的名称
- 如何访问ng个重复生成的表上的字段
- 无法访问javascript中二维数组中的第二个字段
- 如何访问嵌套的表单ng包含范围/字段
- 无法访问字段'通过aspx页面上的javascript函数传递来自代码隐藏中函数调用的客户端id的s值(页面加载
- 如何访问Javascript中的Sitecore字段
- 从Kendo中的columns.filterable.cell.template函数访问列字段名
- 访问Object字段的JavaScript函数
- 通过JQuery AJAX调用使用Python CGI FieldStorage访问字段
- 从JSON序列化的django对象访问字段值
- JSON -访问字段名为'*'星号
- ASP.. NET Gridview如何访问字段上的复选框