বস্তু বা শ্রেণীর নাম পান


204

কোনও বস্তুর ফাংশন নাম পাওয়ার কোনও সমাধান আছে কি?

function alertClassOrObject (o) {
   window.alert(o.objectName); //"myObj" OR "myClass" as a String
}

function myClass () {
   this.foo = function () {
       alertClassOrObject(this);
   }
}

var myObj = new myClass();
myObj.foo();

for (var k in this) {...}- classNameবা সম্পর্কে কোনও তথ্য নেই ObjectName। তাদের মধ্যে একটি পাওয়া সম্ভব?


: আপনি এই দেখতে চাইতে পারেন stackoverflow.com/questions/789675/...
সুধীর Bastakoti

উত্তর:


348

আপনার অবজেক্টের কনস্ট্রাক্টর ফাংশনটি পান এবং তারপরে তার নামের সম্পত্তিটি পরীক্ষা করুন।

myObj.constructor.name

"মাই ক্লাস" প্রদান করে।


175
সতর্ক থাকুন! আপনি যদি জাভাস্ক্রিপ্টটি সংক্ষিপ্ত করে রাখছেন তবে নির্মাণকারীর নাম পরিবর্তন হবে।
ডিবি।

34
হ্যান্ডি, তবে আরও একটি সতর্কতামূলক বিষয় রয়েছে: যদি আপনার অবজেক্টটির প্রোটোটাইপ চেইন থাকে (বাদে Object), আপনি সেই শৃঙ্খলে প্রথম লিঙ্কটির নাম পাবেন, অবজেক্ট তৈরি করতে ব্যবহৃত কনস্ট্রাক্টরের নাম নয়। নিম্নলিখিত উদাহরণ নিন: function Daddy() {}; function Me() {}; Me.prototype = new Daddy; me = new Me;me.constructor.nameতাহলে অপ্রত্যাশিতভাবে ফিরে আসে 'Daddy', না 'Me'
mklement0

7
<আই 9
জেসন

9
আর এই খালি স্ট্রিং ফিরে আসবে, যদি বস্তুর উপর ব্যবহৃত পরিবর্তনশীল মাধ্যমে ঘোষণা করেছিলেন: var Foo = function() {};
আলেকসান্দ্র মাকভ

3
ক্রোম কনসোলটি এমন কিছু জানে যা আপনি না করেন: > myclass=(function(){}); new myclassমুদ্রণmyclass {}
হিউ অ্যালেন

26

উদাহরণ:

function Foo () { console.log('Foo function'); }
var Bar = function () { console.log('Bar function'); };
var Abc = function Xyz() { console.log('Abc function'); };

var f = new Foo();
var b = new Bar();
var a = new Abc();

console.log('f', f.constructor.name); // -> "Foo"
console.log('b', b.constructor.name); // -> "Function"
console.log('a', a.constructor.name); // -> "Xyz"


উদ্ভাসিত মডিউল প্যাটার্নটি ব্যবহার করার সময় দেখে মনে হচ্ছে আপনি সর্বদা "অবজেক্ট" পাবেন। function Foo() { return {'foo':'bar'} }; var f = new Foo(); :(
ব্র্যাড কেন্ট

5

যদি আপনি স্ট্যান্ডার্ড আইআইএফই ব্যবহার করেন (উদাহরণস্বরূপ টাইপস্ক্রিপ্ট সহ)

var Zamboch;
(function (_Zamboch) {
    (function (Web) {
        (function (Common) {
            var App = (function () {
                function App() {
                }
                App.prototype.hello = function () {
                    console.log('Hello App');
                };
                return App;
            })();
            Common.App = App;
        })(Web.Common || (Web.Common = {}));
        var Common = Web.Common;
    })(_Zamboch.Web || (_Zamboch.Web = {}));
    var Web = _Zamboch.Web;
})(Zamboch || (Zamboch = {}));

আপনি প্রোটোটাইপস সামনে টিকা টিকা দিতে পারে

setupReflection(Zamboch, 'Zamboch', 'Zamboch');

এবং তারপরে _ পূর্ণ নাম এবং _ক্লাসনাম ক্ষেত্রগুলি ব্যবহার করুন।

var app=new Zamboch.Web.Common.App();
console.log(app._fullname);

এখানে টিকাদান ফাংশন:

function setupReflection(ns, fullname, name) {
    // I have only classes and namespaces starting with capital letter
    if (name[0] >= 'A' && name[0] &lt;= 'Z') {
        var type = typeof ns;
        if (type == 'object') {
            ns._refmark = ns._refmark || 0;
            ns._fullname = fullname;
            var keys = Object.keys(ns);
            if (keys.length != ns._refmark) {
                // set marker to avoid recusion, just in case 
                ns._refmark = keys.length;
                for (var nested in ns) {
                    var nestedvalue = ns[nested];
                    setupReflection(nestedvalue, fullname + '.' + nested, nested);
                }
            }
        } else if (type == 'function' && ns.prototype) {
            ns._fullname = fullname;
            ns._classname = name;
            ns.prototype._fullname = fullname;
            ns.prototype._classname = name;
        }
    }
}

JsFiddle


4

এটি ইতিমধ্যে উত্তর হিসাবে, আমি কেবল জাভাস্ক্রিপ্টে একটি অবজেক্টের কনস্ট্রাক্টর পাওয়ার ক্ষেত্রে পদ্ধতির পার্থক্যগুলি উল্লেখ করতে চেয়েছিলাম। কনস্ট্রাক্টর এবং আসল অবজেক্ট / শ্রেণির নামের মধ্যে পার্থক্য রয়েছে। নিম্নলিখিতগুলি যদি আপনার সিদ্ধান্তের জটিলতায় জুড়ে থাকে তবে সম্ভবত আপনি খুঁজছেন instanceof। অথবা আপনার নিজেকে জিজ্ঞাসা করা উচিত "আমি কেন এটি করছি? আমি কি এটিই সমাধান করার চেষ্টা করছি?"

মন্তব্য:

obj.constructor.nameপুরোনো ব্রাউজারে পাওয়া যায় না। সমন্বয় (\w+)ES6 শৈলী শ্রেণীর সন্তুষ্ট করা উচিত নয়।

কোড:

var what = function(obj) {
  return obj.toString().match(/ (\w+)/)[1];
};

var p;

// Normal obj with constructor.
function Entity() {}
p = new Entity();
console.log("constructor:", what(p.constructor), "name:", p.constructor.name , "class:", what(p));

// Obj with prototype overriden.
function Player() { console.warn('Player constructor called.'); }
Player.prototype = new Entity();
p = new Player();
console.log("constructor:", what(p.constructor), "name:", p.constructor.name, "class:", what(p));

// Obj with constructor property overriden.
function OtherPlayer() { console.warn('OtherPlayer constructor called.'); }
OtherPlayer.constructor = new Player();
p = new OtherPlayer();
console.log("constructor:", what(p.constructor), "name:", p.constructor.name, "class:", what(p));

// Anonymous function obj.
p = new Function("");
console.log("constructor:", what(p.constructor), "name:", p.constructor.name, "class:", what(p));

// No constructor here.
p = {};
console.log("constructor:", what(p.constructor), "name:", p.constructor.name, "class:", what(p));

// ES6 class.
class NPC { 
  constructor() {
  }
}
p = new NPC();
console.log("constructor:", what(p.constructor), "name:", p.constructor.name , "class:", what(p));

// ES6 class extended
class Boss extends NPC {
  constructor() {
    super();
  }
}
p = new Boss();
console.log("constructor:", what(p.constructor), "name:", p.constructor.name , "class:", what(p));

ফলাফল:

এখানে চিত্র বর্ণনা লিখুন

কোড: https://jsbin.com/wikiji/edit?js,console


3

আমি একই ধরণের সমস্যার মুখোমুখি হয়েছি এবং এখানে উপস্থাপিত সমাধানগুলির মধ্যে কোনওটিই আমি কী কাজ করছি তার পক্ষে অনুকূল ছিল না। আমার কাছে যা ছিল তা ছিল মডেলের কন্টেন্ট প্রদর্শন করার জন্য ক্রিয়াকলাপগুলির একটি সিরিজ এবং আমি ক্লাসের ফাংশনগুলি, পদ্ধতিগুলি তৈরি করে একটি একক বস্তুর সংজ্ঞা অনুসারে এটিকে রিফ্যাক্টর চেষ্টা করছিলাম। সমস্যাটি আমি তখন দেখতে পেলাম যে পদ্ধতিগুলির মধ্যে একটি মডেলের ভিতরে কিছু ন্যাভ-বোতাম তৈরি করেছিল যা ফাংশনগুলির মধ্যে একটিতে অনক্লিক ব্যবহার করে - এখন শ্রেণীর একটি অবজেক্ট। এই ন্যাভ বোতামগুলি পরিচালনা করার জন্য আমি অন্যান্য পদ্ধতিগুলি বিবেচনা করেছি (এবং এখনও বিবেচনা করছি), তবে আমি প্যারেন্ট উইন্ডোতে সংজ্ঞায়িত ভেরিয়েবলগুলি ঝুলিয়ে ক্লাসের জন্য নিজেই পরিবর্তনশীল নামটি সন্ধান করতে সক্ষম হয়েছি। আমি যা করেছি তা ছিল আমার ক্লাসের সাথে 'উদাহরণস্বরূপ' মেলে এমন কোনও কিছুর সন্ধান, এবং যদি একের বেশি হতে পারে,

var myClass = function(varName)
{
    this.instanceName = ((varName != null) && (typeof(varName) == 'string') && (varName != '')) ? varName : null;

    /**
     * caching autosweep of window to try to find this instance's variable name
     **/
    this.getInstanceName = function() {
        if(this.instanceName == null)
        {
            for(z in window) {
                if((window[z] instanceof myClass) && (window[z].uniqueProperty === this.uniqueProperty)) {
                    this.instanceName = z;
                    break;
                }
            }
        }
        return this.instanceName;
    }
}

1

এটা চেষ্টা কর:

var classname = ("" + obj.constructor).split("function ")[1].split("(")[0];

1
এটির ক্ষেত্রে এমন কোনও ঘটনা রয়েছে যা অবজেক্ট কনস্ট্রাক্টর.নামের চেয়ে আরও সঠিক হতে পারে? আমি কেবল এই জটিলতার কোনও কারণ দেখছি না।
JHH

1

আমাদের যা প্রয়োজন:

  1. একটি ফাংশনে একটি ধ্রুবক মোড়ানো (যেখানে ফাংশনটির নামটি আমরা পেতে চাইলে অবজেক্টের নামের সমান হয়)
  2. বস্তুর ভিতরে তীর ফাংশন ব্যবহার করুন

console.clear();
function App(){ // name of my constant is App
  return {
  a: {
    b: {
      c: ()=>{ // very important here, use arrow function 
        console.log(this.constructor.name)
      }
    }
  }
}
}
const obj = new App(); // usage

obj.a.b.c(); // App

// usage with react props etc, 
// For instance, we want to pass this callback to some component

const myComponent = {};
myComponent.customProps = obj.a.b.c;
myComponent.customProps(); // App

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.