Javascript:类方法中的实例名称

时间:2014-01-25 13:13:47

标签: javascript class object

<html>
<body>
<div id="output"></div>

<script>
    function jExgTrend(){

    }

    jExgTrend.prototype.Start = function(text)
    {
        //this must return Instance name : "TestObj"
        var InstanceName = "TestObj";

        document.getElementById("output").innerHTML = "<a href=\"javascript:"+InstanceName+".Notify('"+text+"');\">"+text+"</a>";

    }

    jExgTrend.prototype.Notify = function(msg)
    {
        alert(msg);
    }

    var TestObj = new jExgTrend();
    TestObj.Start("Text of the link");

</script>


</body>
</html>

我该怎么办?方法“Start”应该返回类的Instance的名称。

我知道这个问题很愚蠢: - (

2 个答案:

答案 0 :(得分:0)

你做不到。您可以在实例化时指定名称:

function JExgTrend(name){ this.name = name || 'no name specified'; }
JExgTrend.prototype.Start = function () {
                              alert(this.name);
                            }

var testObj = new JExgTrend('testObj');
var otherTestObj = new JExgTrend('otherTestObj');
var anon = new JExgTrend;
testObj.Start();      //=> testObj
otherTestObj.Start(); //=> otherTestObj 
anon.Start();         //=> no name specified

一种有点奇特的选择:你可以像这样对构造函数进行编程:

function JExgTrend(name,scope) {
  name = name || ( Math.floor( 10000+Math.random()*100000000000) ).toString(16);
  if (!(this instanceof JExgTrend)) {
    return new JExgTrend(name,scope);
  }
  this.name = name;
  if (!JExgTrend.prototype.myname) { 
    JExgTrend.prototype.myname = function(){ console.log(this.name); };
  }
  return (scope || window)[this.name] = this;
}

然后分配这样的对象:

jExgTrend.call(null, 'testObj');
testObj.myname(); //=> testObj

尝试摆弄@ this jsFiddle

答案 1 :(得分:0)

也许你真正需要的是一个身份,而不是一个名字 提供一个id是你可以轻松添加的方法,你可以添加到Object的原型或只是你感兴趣的类:

var idGetter = (function() {
       var currentId = 0;
       return function() {
               // 1. replace 'id' with a readonly property
               //      that will return id for this object
               var thisId = currentId ;
               Object.defineProperty( this, 'id', 
                       { get : function () { return thisId; } } ) ;
               // 2. for the first run of id, return object id
               return currentId++;
       }
}());

Object.defineProperty( Object.prototype, 'id', { get : idGetter } );

使用的小例子:

var someObject = {};
console.log(someObject.id);  // outputs 0

var someObject2 = {};
console.log(someObject2.id); // outputs 1

请注意,Object.defineProperty默认为不可枚举的属性,因此您的对象不会被此属性“污染”(例如,当使用for..in时)。