我正在尝试做这样的事情。
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>
在SO代码段中不起作用,因为SecurityError: Sandbox access violation:
但是可以在此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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句