ডিবাগিংয়ের জন্য অর্থপূর্ণ আউটপুট সরবরাহ করার জন্য কি জাভাস্ক্রিপ্টের টুস্ট্রিং () ফাংশনটিকে ওভাররাইড করা সম্ভব?


115

আমি যখন console.log()আমার জাভাস্ক্রিপ্ট প্রোগ্রামটিতে [object Object]কোনও বিষয়বস্তু আছি তখন আমি কেবল আউটপুটটি দেখি যা কোন বস্তুটি (বা এটি কী ধরণের বস্তু) তা নির্ধারণে খুব কার্যকর নয়।

সি # তে আমি ToString()কোনও সামগ্রীর ডিবাগার উপস্থাপনাটি কাস্টমাইজ করতে সক্ষম হতে ওভাররাইড করার অভ্যস্ত। আমি জাভাস্ক্রিপ্টে করতে পারার মতো কিছু আছে কি?


2
আমি খুঁজে পাই যে আউটপুট হ'ল আপনাকে বলার সবচেয়ে নির্ভরযোগ্য উপায় যা কোনও চলক কী রাখে (বা কমপক্ষে এর চেয়ে ভাল typeof)।
অ্যালেক্স

উত্তর:


102

আপনি toStringজাভাস্ক্রিপ্ট পাশাপাশি ওভাররাইড করতে পারেন । উদাহরণ দেখুন:

function Foo() 
{
}

// toString override added to prototype of Foo class
Foo.prototype.toString = function()
{
    return "[object Foo]";
}

var f = new Foo();
alert(f);  // popup displays [object Foo]

জাভাস্ক্রিপ্টে কীভাবে অবজেক্টের ধরণের নাম নির্ধারণ করা যায় সে সম্পর্কে এই আলোচনাটি দেখুন ।


8
এটি সত্য হলেও সতর্কতা ফাংশন প্রোটোটাইপ toStringসম্পত্তি ওভাররাইড করে ফাংশনের রিটার্ন মান Object.prototype.toString.call(f)প্রদর্শন করবে, এখনও প্রদর্শিত হবে [object Object]
ফ্রেডেরিক ক্রাউটওয়াল্ড 12'15

14
'অবজেক্ট.প্রোটোটাইপ.টো স্ট্রিং.সিএল (চ) এখনও [অবজেক্ট অবজেক্ট] প্রদর্শন করবে।' হ্যাঁ, কারণ এটি 'Foo.prototype.toString' এর চেয়ে সম্পূর্ণ আলাদা ফাংশন, হ'ল।
ট্রায়ঙ্কো

5
আমার মতো অন্য কারও যদি এখানে শেষ হয় তবে আপনি অবজেক্ট.প্রোটোটাইপ.টো স্ট্রিংকল আচরণটি কাস্টমাইজ করতে ES6 এ Sybmol.toStringTag ব্যবহার করতে পারেন। বিকাশকারী.মোজিলা.আর.ইন-
ইউএস

32

toStringআপনার অবজেক্ট বা প্রোটোটাইপের জন্য প্রথমে ওভাররাইড করুন :

var Foo = function(){};
Foo.prototype.toString = function(){return 'Pity the Foo';};

var foo = new Foo();

তারপরে বস্তুর স্ট্রিং প্রতিনিধিত্ব দেখতে স্ট্রিংয়ে রূপান্তর করুন:

//using JS implicit type conversion
console.log('' + foo);

আপনি যদি অতিরিক্ত টাইপিং পছন্দ না করেন তবে আপনি একটি ফাংশন তৈরি করতে পারেন যা কনসোলটিতে তার আর্গুমেন্টগুলির স্ট্রিং উপস্থাপনাগুলিকে লগ করে:

var puts = function(){
    var strings = Array.prototype.map.call(arguments, function(obj){
        return '' + obj;
    });
    console.log.apply(console, strings);
};

ব্যবহার:

puts(foo)  //logs 'Pity the Foo'

puts(foo, [1,2,3], {a: 2}) //logs 'Pity the Foo 1,2,3 [object Object]'

হালনাগাদ

E2015 এই স্টাফের জন্য অনেক ভাল সিনট্যাক্স সরবরাহ করে তবে আপনাকে বাবেলের মতো ট্রান্সপ্লেলার ব্যবহার করতে হবে :

// override `toString`
class Foo {
  toString(){
    return 'Pity the Foo';
  }
}

const foo = new Foo();

// utility function for printing objects using their `toString` methods
const puts = (...any) => console.log(...any.map(String));

puts(foo); // logs 'Pity the Foo'

6
কনসোল.লগ ('' + foo); আপনার সমস্যার উত্তরণ না হওয়া পর্যন্ত এই সমস্যাটি আমি কোনও স্ট্রিং বাস্তবায়ন দেখিনি।
আহমাদালিবলোক

13

ব্রাউজার জেএসে ডিবাগযোগ্য আউটপুট পাওয়ার একটি সহজ উপায় হ'ল জেএসএন-তে কেবল সিরিয়ালাইজ করা। সুতরাং আপনি যেমন একটি কল করতে পারে

console.log ("Blah: " + JSON.stringify(object));

সুতরাং উদাহরণস্বরূপ, alert("Blah! " + JSON.stringify({key: "value"}));পাঠ্যের সাথে একটি সতর্কতা তৈরি করেBlah! {"key":"value"}


এটা বেশ সহজ। আউটপুটটি কিছুটা বিশাল হতে পারে আমি কল্পনা করি, তবে চিমটিতেও কাজ করে!
ডিভাইস 1

@ দেব হ্যান্ডি, কিন্তু টু স্ট্রিং () কে ওভাররাইড করে না।
ড্যান ড্যাসক্লেস্কু

10

আপনি যদি নোড ব্যবহার করছেন তবে এটি বিবেচনার জন্য উপযুক্ত হতে পারে util.inspect

var util = require('util')

const Point = {
  x: 1,
  y: 2,
  [util.inspect.custom]: function(depth) { return `{ #Point ${this.x},${this.y} }` }

}

console.log( Point );

এটি ফল দেবে:

{ #Point 1,2 }

প্রিন্ট পরিদর্শন ছাড়াই সংস্করণটি:

{ x: 1, y: 2 }

6

কেবল toString()পদ্ধতিটি ওভাররাইড করুন ।

সাধারণ উদাহরণ:

var x = {foo: 1, bar: true, baz: 'quux'};
x.toString(); // returns "[object Object]"
x.toString = function () {
    var s = [];
    for (var k in this) {
        if (this.hasOwnProperty(k)) s.push(k + ':' + this[k]);
    }
    return '{' + s.join() + '}';
};
x.toString(); // returns something more useful

আপনি কোনও নতুন ধরণের সংজ্ঞা দিলে এটি আরও ভাল করে:

function X()
{
    this.foo = 1;
    this.bar = true;
    this.baz = 'quux';
}

X.prototype.toString = /* same function as before */

new X().toString(); // returns "{foo:1,bar:true,baz:quux}"

9
এই কোডটি ওপির কনসোল.লগ সমস্যাটি সমাধান করে না, কমপক্ষে নোড.জেএস v0.10.*বা Chrome এ নয় Version 32.0.1700.102। টু স্ট্রিংকে সরাসরি (খোঁড়া) কল করার সময় বা টাইপ কোর্সিওন (ল্যামার) ব্যবহার করে এটি কাজ করবে, কনসোল [/ তথ্য | লগ /] পুরানো প্রাক-মোড টু স্ট্রিংয়ের জন্য ব্যবহার করে।
james_womack

1
এটি এখন 2019 এবং উভয় নোডেজ এবং ক্রোম প্রিটি-প্রিন্ট অবজেক্টগুলি তাদের নিজস্ব, সুতরাং জবরদস্তি (যখন আপনি কোনও স্ট্রিংয়ের সাথে বস্তুটি যুক্ত করবেন) একমাত্র ব্যবহারের ক্ষেত্রে আপনি এই প্রশ্নটি গুগল করবেন বিশ্বাস করি।
ক্লেসুন

6

যদি বিষয়টি নিজের দ্বারা সংজ্ঞায়িত করা হয় তবে আপনি সর্বদা একটি স্ট্রিং ওভাররাইড যুক্ত করতে পারেন।

//Defined car Object
var car = {
  type: "Fiat",
  model: 500,
  color: "white",
  //.toString() Override
  toString: function() {
    return this.type;
  }
};

//Various ways to test .toString() Override
console.log(car.toString());
console.log(car);
alert(car.toString());
alert(car);

//Defined carPlus Object
var carPlus = {
  type: "Fiat",
  model: 500,
  color: "white",
  //.toString() Override
  toString: function() {
    return 'type: ' + this.type + ', model: ' + this.model + ', color:  ' + this.color;
  }
};

//Various ways to test .toString() Override
console.log(carPlus.toString());
console.log(carPlus);
alert(carPlus.toString());
alert(carPlus);



3

যোগ 'Symbol.toStringTag' কাস্টম বস্তু বা বর্গ সম্পত্তি।

এতে নির্ধারিত স্ট্রিংয়ের মানটি এর ডিফল্ট স্ট্রিং বিবরণ হবে কারণ এটি দ্বারা অভ্যন্তরীণভাবে অ্যাক্সেস করা হয়েছে Object.prototype.toString() পদ্ধতি ।

উদাহরণ স্বরূপ:

class Person {
  constructor(name) {
    this.name = name
  }
  get [Symbol.toStringTag]() {
    return 'Person';
  }
}

let p = new Person('Dan');
Object.prototype.toString.call(p); // [object Person]

কিছু জাভাস্ক্রিপ্ট ধরণের যেমন মানচিত্র এবং প্রতিশ্রুতিগুলির মধ্যে অন্তর্নির্মিত toStringTagপ্রতীক সংজ্ঞায়িত রয়েছে

Object.prototype.toString.call(new Map());       // "[object Map]"
Object.prototype.toString.call(Promise.resolve()); // "[object Promise]"

যেহেতু Symbol.toStringTagএকটি সুপরিচিত প্রতীক , আমরা এটি উল্লেখ করতে পারি এবং যাচাই করতে পারি যে উপরের ধরণেরগুলির মধ্যে সিম্বল.টোস্ট্রিংট্যাগ সম্পত্তি রয়েছে -

new Map()[Symbol.toStringTag] // 'Map'
Promise.resolve()[Symbol.toStringTag] // 'Promise'

এটি কি একসাথে toString()সরাসরি অর্জনের একমাত্র উপায় ওভাররাইডের সাথে function MyObj() {} Object.prototype.toString.call(new MyObj()) // "[object MyObj]"?
টোনিক্স

1
@ টোনিক্স - আমারও তাই মনে হয় ... অন্য কোনও উপায় থাকলে দয়া করে আমাকে জানান;)
ড্যানিয়েল্ড

0

Chrome কনসোল লগ আপনাকে অবজেক্টটি পরিদর্শন করতে দেয়।


হ্যাঁ, আমি যদি সঠিকভাবে অবজেক্টটি আউটপুট করি তবে এটি সত্য। তবে কখনও কখনও আমি কেবল স্ট্রিংয়ের অংশ হিসাবে এটি আউটপুট করতে চাই যা আমি অন্যান্য ডেটা ধারণ করতে ব্যবহার করতে পারি এবং যদি আমি সেই ফর্মটি কিছু উপায়ে কাস্টমাইজ করতে পারি তবে এটি ভাল হবে।
ডিভাইস 1

6
আমি শুধু আবিষ্কার করেছি যে আপনি আউটপুট একটি স্ট্রিং সঙ্গে ইনলাইন বস্তু একটি console.log অতিরিক্ত আর্গুমেন্ট ব্যবহার করতে পারেন: console.log("this is my object:", obj)
ডিভাইস 1

0

- এই অপারেশনটি সম্পূর্ণ হতে অনেক সময় লাগে, এবং এটি মজিলা ডক্স অনুসারে নিরুত্সাহিত করা হয়েছে: https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Ojetos_globales/Object/proto

স্পষ্টতই, আধুনিক ব্রাউজারগুলি যথাযথ__প্রোট__ ব্যবহার করে নির্দিষ্ট প্রোটোটাইপ এবং ইসিএমএ 6 নির্দিষ্ট করে।

সুতরাং উদাহরণস্বরূপ, যদি আপনি নিজের বস্তুর সংজ্ঞা হয় geoposition আপনি কল করা উচিত __proto__ পরিবর্তে সম্পত্তি .prototype :

var  geoposition = {

        lat: window.pos.lat,
        lng: window.pos.lng
    };

geoposition.__proto__.toString = function(){ return "lat: "+this.lat+", lng: "+this.lng }
console.log("Searching nearby donations to: "+geoposition.toString());

0

মানচিত্রের অবজেক্টটিকে কীভাবে স্ট্রাইফাই করা যায় তা এখানে একটি উদাহরণ:

  Map.prototype.toString = function() {

    let result = {};

    this.forEach((key, value) => { result[key] = value;});

    return JSON.stringify(result);
  };

-1

আপনি যে কোনও কাস্টম অবজেক্টগুলিকে তাদের নিজস্ব স্ট্রিং পদ্ধতিগুলি দিতে পারেন, বা একটি সাধারণ লিখতে পারেন যা আপনি যে অবজেক্টে দেখছেন তাতে কল করতে পারেন-

Function.prototype.named= function(ns){
    var Rx=  /function\s+([^(\s]+)\s*\(/, tem= this.toString().match(Rx) || "";
    if(tem) return tem[1];
    return 'unnamed constructor'
}

function whatsit(what){
    if(what===undefined)return 'undefined';
    if(what=== null) return 'null object';
    if(what== window) return 'Window object';
    if(what.nodeName){
        return 'html '+what.nodeName;
    }
    try{
        if(typeof what== 'object'){
            return what.constructor.named();
        }
    }
    catch(er){
        return 'Error reading Object constructor';
    }
    var w=typeof what;
    return w.charAt(0).toUpperCase()+w.substring(1);
}

-1

ওভাররাইডের পরিবর্তে toString(), আপনি যদি প্রোটোটাইপ জাভাস্ক্রিপ্ট লাইব্রেরি অন্তর্ভুক্ত করেন তবে আপনি Object.inspect()আরও বেশি উপকারী উপস্থাপনা পেতে ব্যবহার করতে পারেন ।

সর্বাধিক জনপ্রিয় ফ্রেমওয়ার্কগুলিতে অনুরূপ কিছু অন্তর্ভুক্ত রয়েছে।


-1

আপনি জেএসে প্রসারিত বা ওভাররাইড করতে পারেন

String.prototype.toString = function() {
    return this + "..."
}
document.write("Sergio".toString());


এটি কীভাবে 2011 এর উত্তরগুলিতে এমন কিছু যুক্ত করে যা একই সমাধান দেয়?
ড্যান ড্যাসক্লেস্কু

-3
A simple format Date function using Javascript prototype, it can be used for your purpose

https://gist.github.com/cstipkovic/3983879 :

Date.prototype.formatDate = function (format) {
    var date = this,
        day = date.getDate(),
        month = date.getMonth() + 1,
        year = date.getFullYear(),
        hours = date.getHours(),
        minutes = date.getMinutes(),
        seconds = date.getSeconds();

    if (!format) {
        format = "MM/dd/yyyy";
    }

    format = format.replace("MM", month.toString().replace(/^(\d)$/, '0$1'));

    if (format.indexOf("yyyy") > -1) {
        format = format.replace("yyyy", year.toString());
    } else if (format.indexOf("yy") > -1) {
        format = format.replace("yy", year.toString().substr(2, 2));
    }

    format = format.replace("dd", day.toString().replace(/^(\d)$/, '0$1'));

    if (format.indexOf("t") > -1) {
        if (hours > 11) {
            format = format.replace("t", "pm");
        } else {
            format = format.replace("t", "am");
        }
    }

    if (format.indexOf("HH") > -1) {
        format = format.replace("HH", hours.toString().replace(/^(\d)$/, '0$1'));
    }

    if (format.indexOf("hh") > -1) {
        if (hours > 12) {
            hours -= 12;
        }

        if (hours === 0) {
            hours = 12;
        }
        format = format.replace("hh", hours.toString().replace(/^(\d)$/, '0$1'));
    }

    if (format.indexOf("mm") > -1) {
        format = format.replace("mm", minutes.toString().replace(/^(\d)$/, '0$1'));
    }

    if (format.indexOf("ss") > -1) {
        format = format.replace("ss", seconds.toString().replace(/^(\d)$/, '0$1'));
    }

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