【问题标题】:javascript namespace scopejavascript命名空间范围
【发布时间】:2013-03-14 19:31:05
【问题描述】:

我正在学习 javascript,所以不要杀了我。 我正在定义更多不同的命名空间,如下所示:

var name_Class = function(){
  this.variable_name_1 = {}

  this.method_name_1 = function() {}
}

然后..

var second_name_Class = function(){
  this.variable_name_1 = {}

  this.method_name_1 = function() {}
}

如果我在第一个变量中定义和初始化一个变量,然后我尝试在第二个变量中调用它,例如如果写c = new name_Class()它,例如将每个数组重新定义为[],这样我就无法获得之前给它的值。你能帮帮我吗?

【问题讨论】:

  • 这里没有杀戮 - 只是询问、回答和偶尔的口头倒钩。
  • 我们不会因为你学习 JavaScript 而杀了你。但是,如果我们不理解这个问题,我们可能会一脸愤怒;)。你真的应该添加一个你真​​正意思的例子。

标签: javascript oop scope


【解决方案1】:

我不确定你是否明白你在做什么。

这个

var name_Class = function(){
  this.variable_name_1 = {}

  this.method_name_1 = function() {}
}

定义了一个名为 name_Class 的构造函数(顺便说一句,构造函数的第一个字符按照惯例应该大写)

这个

var c = new name_Class();

使用该构造函数创建一个对象。创建新对象并将构造函数绑定到该对象并调用,设置新对象的 variable_name_1 和 method_name_1 属性 c。每次将 new name_Class() 分配给变量时,它都会创建一个全新的对象,该对象绑定了构造函数。您对为该函数创建的其他对象所做的任何更改都不会影响这个新变量。

所有这些都与您的第二个构造函数完全无关,您可以以相同的方式使用它,并且完全不受第一个构造函数的影响。

这些东西在技术上都不是命名空间,它们是类型命名空间 通常是指其他变量被定义为属性的顶级变量。默认情况下,变量是在全局命名空间中定义的,对于浏览器来说就是窗口。

例如,要在命名空间 namespace1 上创建类型为 name_Class 的新对象,您可以这样做

var namespace1  = {};
namespace1.c = new name_Class();

【讨论】:

  • 好的,谢谢。实际上我知道我使用该语法创建了一个新对象,所以我必须使用命名空间语法来检索它之外的变量值?
  • 对不起,我知道你在问什么。如果您想检索其中一个内部变量,例如示例中的 variable_name1,您可以在调用 var c = new name_Class(); 后调用 c.variable_name1
【解决方案2】:

如果您希望在实例上设置值,则可以传入参数。例如

var Swatch = function(){
  this.color = arguments[0] || 'green';
  this.callback = arguments[1] || function() {
     alert(this.color);
  }
  this.callback();
}

//defaults to green if no args are passed
var green = new Swatch();

//or pass in your own values
var red = new Swatch('red',function(){
  alert('New swatch created with color '+this.color);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    相关资源
    最近更新 更多