克罗克福德"是否认真对待"好的部分中的方法实际上有效吗?

时间:2015-07-30 07:58:03

标签: javascript function module

此特定代码之前已被问过两次,但从未提出过问题"它实际上做了什么?"。它出现在克罗克福德书的第41页。

这是本书前面的句法糖:

Object.prototype = function (name, func){
    if(!this.prototype[name]){
    this.prototype[name] = func;
    }

这是deentityify方法:

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

如果在编辑器中你写了类似的东西:

document.writeln( '&lt;&quot;&gt;'.deentityify( ));

您将在浏览器中看到: 但是,如果您在浏览器中键入此内容:     document.writeln( '&lt;&quot;&gt;');

你还会看到:

&LT;&#34;&GT;

我发现当我尝试使用预填表格数据时,通过设置如下所示的值字段,这种方法实际上并没有替换实体:

 var venueInput = document.createElement("input");           
        ...
        venueName = '&lt;&gt;&quot'; // for example
        venueInput.value = venueName.deentityify();
        form.appendChild(venueName);
        form.appendChild(venueInput);

警报还显示实体未被替换。

任何人都可以帮我看看我做错了什么吗? 谢谢!

2 个答案:

答案 0 :(得分:1)

在修复了您分享的代码的一些错误后,它就像一个魅力:

&#13;
&#13;
Object.prototype.method = function (name, func){
    if(!this.prototype[name]){
        this.prototype[name] = func;
    }
}
  
String.method('deentityify', function ( ) {
    var entity = {
        quot: '"',
        lt: '<',
        gt: '>'
    };
    return function() {
        return this.replace(
            /&([^&;]+);/g,
            function (a, b) {
                var r = entity[b];
                return typeof r === 'string' ? r : a;
            }
        );
    };
}());
  
var venueInput = document.createElement("input");  
var label = document.createElement("label");
venueName = '&lt;&gt;&quot;'; // for example
venueInput.value = venueName.deentityify();
label.innerHTML = venueName;
document.getElementById('form').appendChild(label);
document.getElementById('form').appendChild(venueInput);
&#13;
<div id="form"></div>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

  

这是本书前面的语法糖

您复制错误。它应该是这样的:

Function.prototype.method = function (name, func) {
    this.prototype[name] = func;
    return this;
};
  
venueName = '&lt;&gt;&quot'; // for example
  

实体应以&#34 ;;&#34;结尾。你忘记了那个。