3

私はJavascriptの初心者であり、コンストラクターとプロトタイプのプロパティの関係を理解し​​ようとするのに苦労しています。

constructorPrototypeオブジェクトには、コンストラクター関数を指すプロパティがあることを知っています。また、コンストラクター関数にはprototype、プロトタイプオブジェクトを指すプロパティがあります。

これが私が理解しようとしているコードです(私の質問はコードにコメントされています):

function Car(){};
var myCar = new Car();
console.log(Object.getPrototypeOf(myCar)); //why this prints "Car" Object ? isn't it the constructor not the prototype object ? why the prototype object is not printed ?


var Vehicle = {
    getName : function(){
        return "hello";
    }
};
Car.prototype = Vehicle ; //I'm trying to change the prototype property in the constructor to "Vehicle" Object is that done right ?
console.log(Object.getPrototypeOf(myCar).getName()); //Why am i getting getName() function does not exist ?
4

1 に答える 1

6

なぜこれが「車」オブジェクトを出力するのですか?プロトタイプオブジェクトではなく、コンストラクターではありませんか?プロトタイプオブジェクトが印刷されないのはなぜですか?

これが、Chrome(または使用するブラウザ)がオブジェクトに名前を付ける方法です。プロパティをよく見ると、実際にはCar.prototype次のようになります。

ここに画像の説明を入力してください

コンストラクターのプロトタイププロパティを「Vehicle」オブジェクトに変更しようとしていますが、これで問題ありませんか?

既存のオブジェクトのプロトタイプを変更することはできません。拡張することしかできません。設定は、の将来のインスタンスのCar.prototype = Vehicle;プロトタイプのみを変更します。既存のインスタンスは、プロパティを持たない元のプロトタイプオブジェクトを引き続き参照します。CargetName

// create a new instance after setting the new prototype
var myCar2 = new Car();
// yields false
console.log(Object.getPrototypeOf(myCar) === Object.getPrototypeOf(myCar2)); 

これは実際にはプロトタイプとは関係ありませんが、JavaScriptで割り当てと参照がどのように機能するかとは関係ありません。次のオブジェクトがあると想像してください。

var foo = {
    bar: {
        answer: 42
    }
};

foo.barそして、私が他のオブジェクトのプロパティに割り当てると仮定します。

var baz = {};
baz.xyz = foo.bar;

foo.barのような他の値に設定しても、のfoo.bar = {}値は変更されずbaz.xyz、前のオブジェクトを参照します。

元のオブジェクトを拡張する(プロトタイプを拡張する)か、そのプロパティを変更するだけで効果があります。どちらも、同じオブジェクトfoo.barbaz.xyz参照しているためです。

foo.bar.answer = 21;
console.log(baz.xyz.answer); // shows 21
// console.log(foo.bar === baz.xyz); // yields true
于 2012-07-13T23:49:15.173 に答える