有沒有什麼方法可以實現 更改 'string'.__proto__ ?

有沒有什麼方法
可以修改目前字串的 proto 而不會去修改到 String.prototype.split

class UString extends String
{
    split()
    {
        console.log('UString:split');
        return ['UString:split'];
    }
}

const STR = '♥️?典そこで彼らは\'",オリーブ山と呼ばれる山からエルサレムに帰った。';

{
    let str = STR.toString();

    // 原始
    console.log(1, str.split());
}

{
    let str = STR.toString();

    // 此段代碼 = 無效
    str.__proto__ = Object.assign({}, {
        split: UString.prototype.split,
    });

    console.log(2, str.split());
}

{
    let str = STR.toString();

    // 此段代碼 = 無效
    str.__proto__ = UString.prototype;

    console.log(3, str.split());
}

{
    let str = STR.toString();

    // @FIXME 雖然成功了 但是請看下一段
    str.__proto__.split = UString.prototype.split;

    console.log(4, str.split());
}

{
    let str = STR.toString();

    // @BUG 這裡會出錯 因為修改 str.__proto__ 等於修改 String
    console.log(5, str.split());
}
阅读 1.9k
3 个回答

字串作为基本类型没有 __proto__ 。每次想用它的属性的时候,都会现生成一个全新的 String 的对象。

所以,'str'.__proto__ = {} 是没有用的,因为下次再用 'str'.__proto__ 的时候,又是一个全新的 String 对象。

全新的 String 对象用的 __proto__ 一定是 String.prototype

对日项目么?

试试这个

str.__proto__ = Object.assign({}, {
        split: new UString().split,
    });

或者

str.__proto__ = new UString();
var s = 'test';
var s1 = new String('test');
s.__proto__ = {
  test: function(){
    return 'test'
  }
}; //无效
s1.__proto__ = {
  test: function(){
    return 'test'
  }
}; //有效
typeof s.test;// undefined
s1.test();// test
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题