2

我有三个问题,它们都是相关的。

1)我想添加一个名为对象bar的属性。String我做了这个

String.prototype.bar=function() {console.log("jjjj");}
"mystring.bar//function()
"mystring".bar()//jjjj

但我想使用"mystring".bar(没有函数调用)就像我们"mystring".length用来获取字符串长度一样。我怎样才能做到这一点?

2) 现在我想更改 String 对象的内置长度方法。所以我做了这个

>>> String.prototype.length=function(){console.log("xxx");};
function()
>>> "mmmm".length
4

但长度方法没有改变。它仍然只返回字符串的长度。注意:我仅在控制台上更改此方法以用于学习目的

3)我很难从书中理解这个函数,javascript, the good parts by Crockford.(第 40 页)这里是增加 String 对象的方法。它替换字符串中的 HTML 实体并用它们的等价物替换它们

String.method('deentityify',function() {
var entity =  {
quot:'";,
lt:'<',
gt:'<'
};
//return the deentityify method
return function() {
  return this.replace(/&([^&;]+);/g,
         function (a,b) {
         var r = entity[b];
         return typeof r==='string' ? r : a;
        }
     );
   };
}());
'&lt;&quot;&gt;'.dentityify();//<">

关于这个问题的问题:1)由于没有使用prototpye,这个方法是否适用于所有要使用的String对象。

2)在return this.replace(..上面的部分中,我不明白什么参数被给予,a and b.即当我调用 ' 时&lt;&quot;&gt;'.dentityify();,得到什么a and b以及如何执行该匿名函数。

谢谢大家的帮助

4

2 回答 2

2

关于(1) - 不要使用function,直接将属性分配给原型:

String.prototype.bar = "bar from string prototype";
alert('some text'.bar); // "bar from string prototype"

关于(2) - 我认为这是不可能的。

关于 (3) Crockford 定义.method为:

Function.prototype.method = function(name, func) {
   this.prototype[name] = func;
   return this;
};

所以这是一个自定义实现,旨在隐藏prototype

于 2013-06-21T20:56:10.263 回答
2

我想使用“mystring”.bar(无函数调用),就像我们使用“mystring”.length 来获取字符串的长度一样。我怎样才能做到这一点?

假设您想使用函数来动态计算某个值,但想使用普通属性访问的语法,而不是函数,您必须创建一个 getter 属性Object.defineProperty

Object.defineProperty(String.prototype, 'bar', {
    get: function() {
        return 'jjjjj';
    }
});

但长度方法没有改变。它仍然只返回字符串的长度。

那是因为.length不是可写属性

一旦创建了 String 对象,此属性就不会改变。它有属性{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }


我不明白什么参数被赋予ab[...] 以及该匿名函数是如何执行的

.replace对于正则表达式找到的每个匹配项,回调在内部执行。MDN 文档中解释了这些参数的含义。第一个参数是整个匹配,后面的每个参数是表达式中一个捕获组的值。

于 2013-06-21T21:03:14.857 回答