为什么toString不是javascript

时间:2015-06-29 18:44:58

标签: javascript oop inheritance

我试图做这样的事情。

 var myFunc = function() {}
 myFunc.prototype = new String();
 myFunc.prototype.replace = function() {return 'hii, Mr '+ this.toString();}       

 var oVal = new myFunc('Jyotirmay');
 oVal.replace();

o / p ::未捕获的TypeError:String.prototype.toString不是通用的(...)

为什么"功能不通用"一般来说错误来了吗?

为了更清楚,我如何将我的论证,即Jyotirmay从继承类传递给基类,即字符串。这样我就可以通过调用任何正确的字符串函数来获得该值。

我不想通过处理其中的变量来从我的函数中获取传递的值。 我希望由父类处理。你可以用其他语言说super()。

1 个答案:

答案 0 :(得分:2)

目前还不清楚你要从你的问题和评论中找到什么,但也许这就是你想要做的所有事情?

function myFunc(inputArg) {
    this.inputArg = inputArg;
}

myFunc.prototype = {
    replace: function () {
        return 'hii, Mr ' + this.inputArg;
    },
    
    toString: function () {
        return '' + this.inputArg;
    }
};

myFunc.prototype.valueOf = myFunc.prototype.toString;

function log(inputArg) {
    document.getElementById('out').appendChild(document.createTextNode(inputArg + '\n'));
}

var oVal = new myFunc('Jyotirmay');

log(oVal);
log(oVal.replace());
<pre id="out"></pre>

至于Why is toString not generic,这是因为并非所有对象都可以通过相同的转换方法表示为字符串。

根据您的最新评论进行更新

如果不是不可能的话,原生对象很难在Javascript中进行子类化。有一些黑客可以让你获得部分成功,但我不会推荐它们,并且不会在不同的环境中获得好运。

两个(但不是唯一的)这样的黑客是:

iframe

偷窃

function stealObject(objectName, myVariableName) {
    var iframe = document.createElement('iframe');

    iframe.style.display = 'none';
    iframe.src = 'javascript:parent.' + myVariableName + ' = ' + objectName;
    document.body.appendChild(iframe);
    document.body.removeChild(iframe);

    return window[myVariableName];
}

function log(inputArg) {
    document.getElementById('out').appendChild(document.createTextNode(inputArg + '\n'));
}

try {
    stealObject('String', 'MyString');
    MyString.prototype.replace = function () {
        return 'hii, Mr ' + this;
    };


    var oVal = new MyString('Jyotirmay');

    log(oVal);
    log(oVal.toUpperCase());
    log(oVal.replace());
} catch (e) {
    log(e);
}
<pre id="out"></pre>

因为SecurityError: Sandbox access violation:而无法在SO片段中使用,但可以在此jsFiddle上看到它。 typeof oVal将返回object而不是string,而oVal instanceof String将是falseoVal.constructor === String将返回false

另一个黑客

function MyString() {
    this.str = '' + arguments[0];
};

with(MyString.prototype = new String()) {
    toString = valueOf = function () {
        return this.str;
    };
}

MyString.prototype.replace = function () {
    return 'hii, Mr ' + this;
};

function log(inputArg) {
    document.getElementById('out').appendChild(document.createTextNode(inputArg + '\n'));
}

var oVal = new MyString('Jyotirmay');

log(oVal);
log(oVal.toUpperCase());
log(oVal.replace());
<pre id="out"></pre>

这个神奇的length属性已被破坏,您需要调用oVal.toString().lengthtypeof oVal将返回object而非string,但oVal instanceof String将为trueoVal.constructor === String将返回true