我正在尝试做这样的事情。
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
将是false
。 oVal.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().length
。 typeof oVal
将返回object
而不是string
,但oVal instanceof String
将是true
。 oVal.constructor === String
将返回true
。关于javascript - 为什么toString不是JavaScript中的通用函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31123203/