我正在尝试做这样的事情。

 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()。

最佳答案

尚不清楚您要从问题和评论中确切地实现什么,但是也许这就是您正在试图做的一切?

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

关于javascript - 为什么toString不是JavaScript中的通用函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31123203/

10-09 05:00