使用原型来改变javascript中的内置方法

时间:2013-06-21 20:13:56

标签: javascript function object methods prototype

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

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获得了什么以及如何执行匿名函数。

谢谢大家的帮助

2 个答案:

答案 0 :(得分: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

的自定义实现

答案 1 :(得分:2)

  

我想使用“mystring”.bar(没有函数调用),就像我们使用“mystring”.length来获取字符串的长度一样。我怎么能实现这个目标呢?

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

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

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

那是因为.length is not a writeable property

  

创建String对象后,此属性不变。它具有属性{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }


  

我不明白为ab [...]提供了什么参数以及如何执行该匿名函数

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