【问题标题】:create a namespace in javascript在 javascript 中创建命名空间
【发布时间】:2014-10-24 21:46:18
【问题描述】:

您知道如何在 javascript 中为构造函数对象创建名称吗?我有一个小提琴请看这个。 http://jsfiddle.net/m8jLoon9/2/

例如

// you can name the object by using this
function MyConstructorName() {}

// with this one, the name of the objct is the variable
var varConstructorName = function() {};


// MyConstructorName{}
console.log( new MyConstructorName() );

// varConstructorName{}
console.log( new varConstructorName() );

// I have a function that creates an object
// with the name arguments provided
function createANameSpace(nameProvided) {
    // how to create a constructor with the specified name?
    // I want to return an object



    // EDITED, this is wrong, I just want to show what I want on this function
    var TheName = function nameProvided() {};

    // returns an new object, consoling this new object should print out in the console
    // the argument provided
    return new TheName();
}

// create an aobject with the name provided
var ActorObject = createANameSpace('Actor');

// I want the console to print out
// Actor{}
console.log( ActorObject  );

【问题讨论】:

  • 控制台中的“名称”是内部提供给开发工具的,它不是代码本身可以反映的东西。 function.name 必须来自函数语句。你可以使用 eval() 来构建一个命名函数,就像一个硬编码的函数一样,但是由于这个名字无论如何都没有用,所以不值得。
  • 是的,它在 devtools 上,但至少会显示名称。 :)

标签: javascript object constructor namespaces


【解决方案1】:

其实很简单的实现如下

创建者:

var my_name_space = { first: function(){ alert("im first"); }, second: function(){ alert("im second"); } };

通过以下方式访问它:

my_name_space.first();

my_name_space.second();

这与在对象中存储变量非常相似:

var car = {type:"Fiat", model:500, color:"white"};

除了“菲亚特”是另一个功能本身。您可以考虑命名空间是和具有函数的对象。

【讨论】:

  • 我不是在谈论访问它,我只是希望构造函数的名称是提供的名称。我的目的是让其他开发人员在控制台中使用“this”关键字时了解他们所处的上下文,而且我认为最好命名它。我不想使用第一种方法命名我的所有构造函数。麻烦做同样的小事。 :) 无论如何,你这样做的方式,它只是引用一个函数,而不是实际命名它。
  • "this" 指的是最近的范围,因此函数的名称就是您的命名空间。我相信命名您的“外部对象”-> 如果您将所有函数包装在其中,命名空间会起作用吗? - 如果我误解了你,我很抱歉。
  • console.log(this) 带有字面量对象将打印对象{},根本没有名称,但使用构造函数你会知道或其他人知道什么是'this'
  • 你见过小提琴吗?试试看控制台,你就会明白我的意思了。
  • 我明白了。我建议使用 this.name 而不是 this(如果函数不是匿名的)。 jsfiddle.net/m8jLoon9/5 这样就不用每次都定义构造函数了。
【解决方案2】:

这似乎是对语言的滥用,但您可以通过执行以下操作返回任意命名的对象:

function createANamespace(nameProvided) {
  return {
    constructor: {name: nameProvided}
  };
}

我只在 chrome 上试过这个,所以 ymmv。

编辑:或者,如果你真的想滥用语言:

function createANamespace(name) {
  return new Function('return new (function '+ name + '(){} )')
}

【讨论】:

  • function createANamespace(name) { return new Function('return new (function '+ name + '(){} )') } 这更接近我一直在问的问题,但它返回一个字符串?,同样通过这样做,看起来 eval 会触发?我害怕 eval :( opps,对不起,它返回函数类型。
  • 哇!有效,运行返回的函数后,提供的名字其实就是构造函数的名字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多