我试图做这样的事情。
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()。
答案 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
将是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
。