GVKun编程网logo

在javascript中覆盖对象的toString(js覆盖方法)

19

在本文中,我们将给您介绍关于在javascript中覆盖对象的toString的详细内容,并且为您解答js覆盖方法的相关问题,此外,我们还将为您提供关于javascript–在单个模块中覆盖node.

在本文中,我们将给您介绍关于在javascript中覆盖对象的toString的详细内容,并且为您解答js覆盖方法的相关问题,此外,我们还将为您提供关于javascript – 在单个模块中覆盖node.js querystring.escape、javascript – 自定义toString的推荐方法是什么?使用Symbol.toStringTag或覆盖toString?、Javascript 中使用 String 对象的方法、JavaScript中json对象和string对象之间相互转化_javascript技巧的知识。

本文目录一览:

在javascript中覆盖对象的toString(js覆盖方法)

在javascript中覆盖对象的toString(js覆盖方法)

我正在使用toString方法,当我尝试覆盖函数的toString方法时,我可以看到当我尝试console.log-ging时的效果. http://jsbin.com/bigocijuqo/1/edit?js,console.

function greet(){
  console.log("Hello!");
}
console.log(greet);

greet.toString = function () {
   return "Overridden toString";
};
console.log(greet);

产生

function greet(){
window.runnerWindow.proxyConsole.log("Hello!");
}
Overridden toString

但是,当我尝试使用对象时,它似乎没有生效. http://jsbin.com/jebunakibi/1/edit?js,console

var ray = {
  'name': 'Ray','fav_food': 'Carrots'
};

console.log(ray);

ray.toString = function () {
  return "My name is " + this.name + " and I loooove " + this.fav_food;
};

console.log(ray);

产生

[object Object] {
  fav_food: "Carrots",name: "Ray"
}
[object Object] {
  fav_food: "Carrots",name: "Ray",toString: function () {
  return "My name is " + this.name + " and I loooove " + this.fav_food;
}
}

我预计第二个console.log会打印出来

My name is Ray and I loooove Carrots

我甚至尝试在Object.prototype中更改toString方法,但它仍然没有产生任何影响.有人可以解释这段代码有什么问题吗?

解决方法

有趣. Chrome ignores是console.log()输出中的toString()方法.

如果你做了警告(光线),你会看到“我的名字是雷,我喜欢胡萝卜”.

要在控制台中看到相同的内容,请执行以下操作:

console.log(ray.toString());

… 或这个:

console.log(ray + '');

您可以为此目的创建一个新的控制台功能:

console.say= function(s) {
  console.log(s + '');
}

例:

console.say= function(s) {
  console.log(s + '');
}

var ray = {
  'name': 'Ray','fav_food': 'Carrots'
};

ray.toString = function () {
  return "My name is " + this.name + " and I loooove " + this.fav_food;
};

console.say(ray); //My name is Ray and I loooove Carrots

javascript – 在单个模块中覆盖node.js querystring.escape

javascript – 在单个模块中覆盖node.js querystring.escape

我想在对象上使用querystring.stringify.字符串的要求略微偏离标准,星号,斜杠和撇号都需要转义. Querystring不会逃避这些(它们通常不需要)但是文档说querystring.escape是专门公开的,因此我们可以使用我们自己的函数覆盖它.以下内容对我有用:
querystring.escape = function(str) {
    str = encodeURIComponent(str)
        .replace(/\*/g,'%2A')
        .replace(/\(/g,'%28')
        .replace(/\)/g,'%29')
        .replace(/'/g,'%27');
    return str;
};

我唯一担心的是,如果我理解正确,这可能会改变其他模块的行为,这些模块将来可能还需要查询字符串(具有正常的转义函数). node.js文档说,模块只加载一次,原始实例返回到后续的require调用.有没有办法让我强制这个特殊的查询字符串实例是唯一的?

显然我可以编写一个在传统调用querystring.stringify之后进行替换的包装器,但我很好奇,因为标准节点模块确实有一个“全局”设置对我来说似乎很奇怪,除非实际上有某种方式毕竟需要一个独特的实例.

解决方法

Is there a way for me to force this particular instance of querystring to be unique?

并不是的.节点的module caching是每进程和based on the module’s filepath.

更改不会进入/从Child Processes或Clusters进行更改.因此,您可以通过其中一个使用自己的查询字符串来隔离脚本.

但是,在同一个过程中,Node没有提供绕过此功能的官方方法来检索单个模块的唯一实例.

this might change the behavior of other modules that might also require querystring (with its normal escape function) in the future.

好吧,如果URL编码的值有其他字符编码,则它仍然有效.只是通常他们不需要.

而且,我想,有可能影响对编码值寄予期望的模块.但是,这通常是一个奇怪的选择(例外情况是你自己的querystring.escape的单元测试).因此,只要它可以正确解码,它应该没问题.

querystring.escape = function (str) { /* ... */ }; // your function here

var sample = "a(b*c)'d";

var encoded = querystring.escape(sample);
console.log(encoded);             // a%28b%2ac%29'd

var decoded = querystring.unescape(encoded);
console.log(decoded);             // a(b*c)'d
console.log(decoded === sample);  // true

而且,覆盖querystring.escapequerystring.unescape的能力是设计的:

The escape function used by querystring.stringify,provided so that it Could be overridden if necessary.

javascript – 自定义toString的推荐方法是什么?使用Symbol.toStringTag或覆盖toString?

javascript – 自定义toString的推荐方法是什么?使用Symbol.toStringTag或覆盖toString?

我对实现什么感到困惑,首先,我的模块将使用Babel,因此实现ES6功能没有问题,其次,我将使用类构造来创建类而不是旧的原型方法.所以现在,我很困惑,如果我要覆盖toString(这是旧的方式)或只是实现Symbol.toStringTag,就像这个MDN文档说的那样,https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toStringTag
那么推荐的方式是什么?

解决方法

他们完全是为了不同的事情.

如果您尝试定义对象的字符串版本,请提供toString方法.

如果您尝试向类添加Object.prototype.toString将用于构建其“[object XYZ]”字符串的信息,请提供一个名称为Symbol.toStringTag值的方法.

以下是差异的说明:

class Example {
    constructor(x) {
        this.x = x;
    }
    toString() {
        return `Example[x=${this.x}]`;
    }
    get [Symbol.toStringTag]() {
        return "Example";
    }
}
const e =  new Example(42);
console.log(e.toString());                      // Example[x=42]
console.log(String(e));                         // Example[x=42]
console.log(Object.prototype.toString.call(e)); // [object Example]

如果我们没有提供get [Symbol.toStringTag],那最后一行将输出“[object Object]”而不是“[object Example]”.

请注意,它不必是getter,而是可以是数据属性.由于您使用的是Babel,如果您包含Public Class Fields支持(目前为第2阶段),则可以将其定义为:

class Example {
    constructor(x) {
        this.x = x;
    }
    toString() {
        return `Example[x=${this.x}]`;
    }
    [Symbol.toStringTag] = "Example";
}

……虽然它当然是可写的.交替:

class Example {
    constructor(x) {
        this.x = x;
    }
    toString() {
        return `Example[x=${this.x}]`;
    }
}
Object.defineProperty(Example.prototype,Symbol.toStringTag,{
    value: "Example"
});

Javascript 中使用 String 对象的方法

Javascript 中使用 String 对象的方法

String 对象有许多的方法,因此我们这里的讨论范围只限于其中的两个,indexOf() substring() 方法。

你已经看到,JavaScript 字符串是由字符组成的。这些字符中的每一个都有一个索引。这个索引是从开始的,所以第一个字符的位置的索引是,第二个是 1,以此类推。方法 indexOf() 查找并返回子字符串起始的索引位置(lastIndexOf() 方法则返回子字符串结束的位置)。举个例子,如果我们想让我们的用户输入 e-mail 地址,我们能检查在它们的输入中是否包含 @符号。(虽然这不能确保邮件地址是合法的,但至少可以在很大程度上确保其有效,稍候我们会在这本书中接触更复杂的数据校验。)

接下来,我们使用 prompt()方法获取用户的 e-mail 地址,然后检查输入中是否包含 @符号,并使用 indexOf()返回 @符号的索引:

<html>

<body>

<script type="text/javascript">

var userEmail= prompt( "Please enter your email

address ", "" );

document.write( userEmail.indexOf( "@" ) );

</script>

</body>

</html>

如果没有发现 @ ,在页面中会输出 -1。只要在这个字符出现在输入字符串中的任何位置,就会返回索引中它的位置,换句话说某个大于 -1 的数。

substring() 函数使用子字符串的起始和结束位置的索引作为参数,从另一个字符串中截取一个字符串。我们可以不使用第二个参数来返回从第一个索引到字符串结束的所有字符串。因此要截取从第三个字符(索引 2)到第六个字符(索引 5)的索引字符,我们这样写:

<html>

<body>

<script type="text/javascript">

var myOldString = "Hello World";

var myNewString = myOldString.substring( 2, 5 );

document.write( myNewString );

</script>

</body>

</html>

你在浏览器中会看到页面中输出了 llo。注意 substring() 方法复制了它返回的子字符串,但它没有改变原来的字符串。

当你处理未知的值时,substring() 方法真的会用到它自己。这是另一个例子,它同时使用了 indexOf()和 substring() 方法:

<html>

<body>

<script type="text/javascript">

var characterName = "my name is Simpson, Homer";

var firstNameIndex = characterName.indexOf( "Simpson,

" ) + 9;

var firstName = characterName.substring( firstNameIndex );

document.write( firstName );

</script>

</body>

</html>

我们在变量 characterName 的字符串中提取 Homer, 使用 indexOf() 查找姓的起始位置,然后给它加上 9 得到名的起始位置的索引(因为Simpson, 9 个字符的长度),并把它存储在 firstNameIndex 中。它会在 substring() 方法中被使用来提取从名的起始开始的所有字符 - 我们没有指定最后一个索引,因此这个字符串中的其余字符都会被返回。

 
原文链接: http://blog.csdn.net/newhappy2008/article/details/2032601

JavaScript中json对象和string对象之间相互转化_javascript技巧

JavaScript中json对象和string对象之间相互转化_javascript技巧

json对象
复制代码 代码如下:

var json = {aa:true,bb:true};
var json1 = {aa:''b'',bb:{cc:true,dd:true}};

1:js操作json对象
复制代码 代码如下:

for(var item in json){
alert(item); //结果是 aa,bb, 类型是 string
alert(typeof(item));
alert(eval("json."+item)); //结果是true,true类型是boolean
eval(("json."+item+"=false;")); //改变json对象的值
}

2:json对象转化为String对象的方法
复制代码 代码如下:

/**
* json对象转字符串形式
*/
function json2str(o) {
var arr = [];
var fmt = function(s) {
if (typeof s == ''object'' && s != null) return json2str(s);
return /^(string|number)$/.test(typeof s) ? "''" + s + "''" : s;
}
for (var i in o) arr.push("''" + i + "'':" + fmt(o[i]));
return ''{'' + arr.join('','') + ''}'';
}

3:string对象转化为json对象
复制代码 代码如下:

function stringToJson(stringValue)
{
eval("var theJsonValue = "+stringValue);
return theJsonValue;
}

4:json数组转化为 String对象的方法(要掉要上面那个方法)
复制代码 代码如下:

function JsonArrayToStringCfz(jsonArray)
var JsonArrayString = "[";
for(var i=0;iJsonArrayString=JsonArrayString+JsonToStringCfz(jsonArray[i])+",";
}
JsonArrayString = JsonArrayString.substring(0,JsonArrayString.length-1)+"]";
return JsonArrayString;
}

5:利用json.js json转string
复制代码 代码如下:


<script> <BR>var date = {myArr : ["a" , "b" , "c" , "d"] , count : 4}; <BR>var str = JSON.stringify(date); <BR>alert(str); <BR></script>

关于在javascript中覆盖对象的toStringjs覆盖方法的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于javascript – 在单个模块中覆盖node.js querystring.escape、javascript – 自定义toString的推荐方法是什么?使用Symbol.toStringTag或覆盖toString?、Javascript 中使用 String 对象的方法、JavaScript中json对象和string对象之间相互转化_javascript技巧等相关知识的信息别忘了在本站进行查找喔。

本文标签: