1

JavaScript での次のプロトタイプの動作と混同しています。

function A(){
};

A.prototype.toString = function(){
            console.log('first');
               }

var a = new A(), b;

A.prototype = {
    toString:function(){
        console.log('second');
    }
}

b = new A();

a.toString();
//outputs :  first

b.toString();
//outputs :  second

「second」を出力するb.toStringと比較すると、a.toString が「frist」出力するのはなぜですか。私がここで欠けているものを誰か説明してください。

4

3 に答える 3

2

プロトタイプ リンクは、オブジェクトを構築したコンストラクターとは関係なく、オブジェクト自体に格納されます。

これを呼び出すとnew A()、次のことが起こります。

var a = {};
a.__proto__ = A.prototype;
A.call(a);

上記は標準的な構文ではありませんが、chrome と firefox で機能することに注意してください。

したがって、 を上書きすると、同様のコードで期待されるようにA.prototypea.__proto__まだ古いものにリンクしています。A.prototype

var A = 10, a, b;

a = A;
A = 7; //a is still 10
b = A; 

プロトタイプを再割り当てすることはお勧めしません。コンストラクタ プロパティを再設定する必要があり、追加のレベルのインデントが必要になるためです。

タイプを減らしたい場合は、プロトタイプへの参照を保存するだけです。

function A() {

}
var fn = A.prototype;

fn.toString = function() {

};

fn.valueOf = function() {

};

fn.toJSON = function() {

};
于 2013-06-18T21:55:16.297 に答える
0

関数 A(){ };

A.prototype.toString = function(){
            console.log('first');
               }     // here A prints 'first'

var a = new A(), b;  

A.prototype = {    
    toString:function(){
        console.log('second');
    }
}                    // here A prints 'second'

b = new A();

a.toString();
//outputs :  first

b.toString();
//outputs :  second
于 2013-06-18T21:52:25.410 に答える
0

オブジェクトの内部[[Prototype]](継承元) は、構築時にコンストラクターのプロトタイプに設定されます。コンストラクターのプロトタイプに新しいオブジェクトを割り当てて[[Prototype]]も、既に作成されているインスタンスは変更されません。

実際、オブジェクトが作成されると、非標準のプロパティ[[Prototype]]以外で別のものを割り当てることはできません。__proto__

編集

本当に明確にするために:

// A simple constructor
function Person(name) {
  this.name = name;
}

// Assign a method to its default prototype
Person.prototype.showName = function() {
  return this.name;
}

// This instance will be assigned the above as its [[Prototype]]
// with its showName method
var fred = new Person('Fred');

// Assign a new object to Person.prototype 
Person.prototype = {};

// Assign a new showName method
Person.prototype.showName = function() {
  return 'My name is ' + this.name;
}

// This instance has the new object as its [[Prototype]]
var sue = new Person('Sue');

console.log(
    fred.showName() + '\n'  // Fred 
  + sue.showName()          // My name is Sue
);

fredは元のプロトタイプ オブジェクトから引き続き継承され、sueは変更後に作成 (インスタンス化) された新しいオブジェクトから継承されていることがわかります。

于 2013-06-18T22:16:34.470 に答える