【问题标题】:The inheritance of javascriptjavascript的继承
【发布时间】:2010-07-14 03:49:01
【问题描述】:

也许这个问题很简单,但我现在无法理解。

String.prototype.self=function()
{
    return this;
}
var s="s";

alert("s".self()=="s".self()) //false;
alert(s.self()==s.self()) //false;

如果你知道原因,请告诉我为什么结果是“假”。

【问题讨论】:

    标签: javascript object primitive


    【解决方案1】:

    这是因为当从原始值(例如 "s")访问属性时,property accesors 在内部强制它 ToObject,并且比较失败,因为它检查了两个不同的对象引用。

    例如:

    String.prototype.test = function() {
      return typeof this;
    }
    
    "s".test(); // "object"
    

    这就像比较:

    new String("s") == new String("s"); // false
    

    【讨论】:

    • 为什么第二个例子失败了?
    • @Graphain 在表达式s.self() == s.self() 中,包含在s 变量中的值被强制两次ToObject,因为s 持有一个原语,当点(.)使用属性访问器,强制对象访问String.prototype 成员。比较大致相当于var s = 's'; new String(s) == new String(s);,它也产生false
    • @Graphain 通俗地说,虽然两个字符串对象包含相同的数据,但它们是不同的对象,因此 == false。
    • 忘记在 ECMAScript 第 5 版中提及这一点。标准,OP 代码将在strict mode 下按预期工作。在这种情况下,图元不再隐式转换为对象。
    猜你喜欢
    • 2010-10-30
    • 1970-01-01
    • 2013-03-28
    • 2011-01-02
    • 2021-12-07
    • 2011-11-27
    • 2016-06-25
    相关资源
    最近更新 更多