2
    function Obj1(name){
        this.__proto__={
            Name:name,
            getName:function(){
                alert(this.Name); 
            }


        };

    }

    function Obj2(name){
       this.prototype={
           Name:name,
           getName:function(){
           alert(this.Name); 
           };


       };

    }
    x=new Obj1("blue shark");
    z=new Obj2("red shark");
    x.getName();
    z.getName();// error:z.getName() is not a function

2つの違いは何ですか?prototypeコンストラクタ関数にのみ使用されると言う人もいますが、この場合は機能しません....代わりに__proto__なぜ機能するのですか?

4

3 に答える 3

5

__proto__(これは標準ではありません (ただし、すぐになる可能性があります)))オブジェクトのプロトタイプを設定します。

.prototypeを使用してコンストラクターとして設定された関数を呼び出すことによって作成されたオブジェクトのプロトタイプを設定しますnew

また、言及する価値があるのはObject.create

以下に例を示します。

疑似クラシック.prototype:

function Car(){
   this.x = 15;
}
Car.prototype.y = 10;

var g = new Car();
g.y; // this is 10;

使用__proto__(これを使用しないでください!):

var g = {x:15};
g.__proto__ = {y:10};
g.y; // this is 10;

newこの方法は正しく、コンストラクターを次のように使用しません。

var g = Object.create({y:10}); //creates x with prototype {y:10}
g.x = 15;
g.y; // this is 10

これらをカバーする MDN の興味深いチュートリアルを次に示します。

于 2013-05-06T08:20:28.350 に答える
2

関数のみがプロパティ プロトタイプを持ちます。 関数 self にプロトタイプを設定する必要があります。

function Obj2(name){
    this.name = name;
}

Obj2.prototype={
    getName:function(){
       alert(this.Name); 
    }
};
于 2013-05-06T08:25:06.587 に答える
2

__proto__は標準プロパティではありません。

とにかく、によって作成されたすべてのオブジェクトは、コンストラクター(関数)のメンバーnewからプロトタイプを取得します。プロトタイプ メンバーには名前がないことに注意してください。直接アクセスすることはできません。.prototypeObject.getPrototypeOf(x)

特定のプロトタイプでオブジェクトを作成する場合、コードはObject.create(proto)ほぼ同等です

function makeObjectWithPrototype(x) {
    function makeit() { }
    makeit.prototype = x;
    return new makeit();
}
于 2013-05-06T08:35:04.307 に答える