1

どこかで読み、同じもの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

2 つの違いは何ですか? 標準コードが機能しないのはなぜですか? さらに、ほとんどのブラウザー (IE 6-8、9、10、chrome、firefox、mozilla、opera、webkit) でプロトタイプの継承を機能させるにはどうすればよいか知りたいです。

4

1 に答える 1

3

これ.__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
于 2013-05-05T05:25:44.447 に答える