我有三个问题,所有问题都是相关的。
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;
}
);
};
}());
'<">'.dentityify();//<">
关于这个问题的问题: 1)因为没有使用prototpye,所以在所有要使用的String对象上都可以使用此方法。
2)在上面的return this.replace(..
部分,我不明白给a and b.
的参数是什么,即当我调用'<">'.dentityify();
时,a and b
获得了什么以及如何执行匿名函数。
谢谢大家的帮助
答案 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 }
。
我不明白为
a
和b
[...]提供了什么参数以及如何执行该匿名函数
对于正则表达式找到的每个匹配,回调由.replace
在内部执行。 MDN documentation解释了论点的含义。第一个参数是整个匹配,每个后面的参数是表达式中其中一个捕获组的值。