【问题标题】:Object.prototype not working but Object.__proto__ working why?What to do to make my code working in all browsers?Object.prototype 不工作但 Object.__proto__ 工作为什么?如何使我的代码在所有浏览器中工作?
【发布时间】:2013-05-05 05:20:07
【问题描述】:

我在某处读到Object.__proto__Object.prototype 指向同一个东西,Object.prototype 是标准方式,但昨晚我试图用Object.prototype 继承一个类,但它没有用然后我试图弄清楚Object.__proto__Object.prototype 是否都指向同一个东西。令我惊讶的是

    alert(Object.__proto__===Object.prototype);

在警告框中显示false 因此,为了弄清楚哪一个有效,我编写了以下代码

    function Cx(){
    this.objName="i m X";
    this.prototype={ };
    this.prototype.getMyName=function (){
alert(this.objName);
       }
    this.__proto__={ };
    this.__proto__.hMyName=function(){
alert("I am hMyName");
      }
    }
    function InheritCx(){
//var y=new Cx();
this.objName="I am InheritCx";
this.__proto__=new Cx();

    }
    y= new InheritCx();
    y.hMyName();//displayes "I am hMyName" in alertbox when using chrome or mozilla
    y.getMyName();//displays an error in chrome and mozilla

两者有什么区别,为什么标准代码不起作用? 此外,我有兴趣知道如何使原型继承在大多数浏览器(IE 6-8、9、10、chrome、firefox、mozilla、opera 和 webkit)中工作?

【问题讨论】:

  • Object.__proto__ === Function.prototype,至少在 Chrome 中(另见下面的评论)
  • “我在某处读到 Object.__proto__Object.prototype 指向同一个东西……”。没有。 Object 是一个函数,所以 Object.__proto__ 将是 Function.prototype
  • @FabrícioMatté 很酷。我们需要等待什么版本的 IE 死机才能真正使用它(严肃的问题)?
  • @JanDvorak 泄露的Windows Blue的IE(可能是IE11)支持__proto__听说了。

标签: javascript prototype prototypal-inheritance


【解决方案1】:

.__proto__ 是一种非标准方法,用于获取给定对象继承的下一个对象。读取属性相当于标准的Object.getPrototypeOf()

var o = {}; // new object

console.log(o.__proto__ === Object.getPrototypeOf(o)); // true

函数的.prototype 属性是新对象将从作为构造函数调用该函数时创建的对象继承的对象(使用new

因此,如果我们采用一个函数,通过使用new 将其作为构造函数调用,然后采用新对象并请求其__proto__,它将与在.prototype 属性上找到的对象相同构造函数。

function Ctor() {
    // our constructor function
}

var o = new Ctor();

console.log(o.__proto__ === Ctor.prototype); // true

【讨论】:

  • +1 不知道getPrototypeOf。不过,__proto__ 正在成为 ES6 草案的标准,对吧?
  • @FabrícioMatté:从我上次查看 ES6 草案开始,它就作为浏览器环境的可选属性包含在末尾的附录中。所以基本上似乎是在承认它的存在。不知道现在情况如何。
  • 我明白了。这个related answer 表示应该在 ES6 中标准化,目前在附件 B(规范)B.3.1
  • 我以为var o=new Ctor(); 会创建Ctor 对象的实例,但你说o 继承自Ctor?我想知道发生了什么...继承创建对象的实例并修改它?如果是这样,原型继承和寄生继承有什么区别......它们不是一样吗?
  • @FabrícioMatté:很好。希望它不会被剪掉。
猜你喜欢
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
  • 2011-06-05
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
相关资源
最近更新 更多