为什么toString不是JavaScript中的通用函数

乔蒂米尔

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

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

Xotic750

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

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而不是stringoVal 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会回来objectstringoVal instanceof String不会回来trueoVal.constructor === String会回来的true

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么“预测”不是通用函数?

来自分类Javascript

为什么函数的自变量不是JavaScript中的数组对象?

来自分类Dev

为什么typeof +不是“函数” javascript

来自分类Dev

为什么 mongoose 中的 save() 不是函数?

来自分类Java

为什么JUnit断言方法在Java中不是通用的?

来自分类Dev

为什么需要在对象中的函数中的if语句中的“ this”内部而不是外部?的JavaScript

来自分类Dev

为什么我的 javascript 代码中的“建筑物”不是函数?

来自分类Dev

什么时候通用函数不是通用函数?

来自分类Dev

为什么通用类型不是正确的类型?

来自分类Dev

为什么要使用.toString(32)而不是.toString(36)?

来自分类Dev

为什么标准库的通用数学函数不是“常数表达式”?

来自分类Dev

为什么Haskell的“通用”类类型族“ Rep a”被标注为类型构造函数而不是类型?

来自分类Dev

为什么通用引用必须为成员函数而不是类使用模板?

来自分类Dev

为什么 Swift 不是从扩展通用 where 子句调用函数?

来自分类Dev

JavaScript:为什么有些函数不是方法?

来自分类Dev

使用defun或setf首选在通用Lisp中创建函数定义是为什么?为什么?

来自分类Dev

为什么javascript在一个函数而不是另一个函数中从父作用域访问值?

来自分类Dev

为什么arc()函数在JavaScript中画线

来自分类Dev

为什么.every()不是函数?

来自分类Dev

为什么函数不是对象?

来自分类Dev

为什么 getState() 不是函数?

来自分类Dev

为什么这个函数在 golang 中不是线程安全的?

来自分类Dev

为什么sh(不是bash)抱怨.bashrc中定义的函数?

来自分类Dev

为什么错误st.data不是jquery中的函数?

来自分类Dev

为什么C ++中的rand()函数不是真正随机的

来自分类Dev

在函数调用中,为什么逗号不是顺序点?

来自分类Dev

为什么在 node.js 中 `func` 不是函数?

来自分类Dev

在Julia中,为什么@printf是宏而不是函数?

来自分类Dev

为什么(或不是)在构造函数中设置字段是线程安全的?

Related 相关文章

  1. 1

    为什么“预测”不是通用函数?

  2. 2

    为什么函数的自变量不是JavaScript中的数组对象?

  3. 3

    为什么typeof +不是“函数” javascript

  4. 4

    为什么 mongoose 中的 save() 不是函数?

  5. 5

    为什么JUnit断言方法在Java中不是通用的?

  6. 6

    为什么需要在对象中的函数中的if语句中的“ this”内部而不是外部?的JavaScript

  7. 7

    为什么我的 javascript 代码中的“建筑物”不是函数?

  8. 8

    什么时候通用函数不是通用函数?

  9. 9

    为什么通用类型不是正确的类型?

  10. 10

    为什么要使用.toString(32)而不是.toString(36)?

  11. 11

    为什么标准库的通用数学函数不是“常数表达式”?

  12. 12

    为什么Haskell的“通用”类类型族“ Rep a”被标注为类型构造函数而不是类型?

  13. 13

    为什么通用引用必须为成员函数而不是类使用模板?

  14. 14

    为什么 Swift 不是从扩展通用 where 子句调用函数?

  15. 15

    JavaScript:为什么有些函数不是方法?

  16. 16

    使用defun或setf首选在通用Lisp中创建函数定义是为什么?为什么?

  17. 17

    为什么javascript在一个函数而不是另一个函数中从父作用域访问值?

  18. 18

    为什么arc()函数在JavaScript中画线

  19. 19

    为什么.every()不是函数?

  20. 20

    为什么函数不是对象?

  21. 21

    为什么 getState() 不是函数?

  22. 22

    为什么这个函数在 golang 中不是线程安全的?

  23. 23

    为什么sh(不是bash)抱怨.bashrc中定义的函数?

  24. 24

    为什么错误st.data不是jquery中的函数?

  25. 25

    为什么C ++中的rand()函数不是真正随机的

  26. 26

    在函数调用中,为什么逗号不是顺序点?

  27. 27

    为什么在 node.js 中 `func` 不是函数?

  28. 28

    在Julia中,为什么@printf是宏而不是函数?

  29. 29

    为什么(或不是)在构造函数中设置字段是线程安全的?

热门标签

归档