1

次のようにコードします。

 function Teacher(name, age) {
        this.name = name;
        this.age = age;
    }
    Teacher.prototype.sayName = function() {
        alert(this.name);
    };
    Teacher.prototype.sayHi = function() {
        alert("Hi, I'm " + this.name);
    };
    console.log(Teacher.prototype instanceof Teacher);  // false
    console.log(Teacher.prototype instanceof Object);   // true
    console.log(Teacher.prototype);  // Teacher {sayName: function, sayHi: function}

ps 上記の出力はクロムです。最初の console.log は Teacher.prototype が Teacher のインスタンスではないことを示していますが、3 つ目の console.log は Teacher.prototype が Teacher のインスタンスであることを (直感的に) 示しており、矛盾しています。

Object.prototype は Teacher.prototype のプロトタイプ チェーンにあるため、2 番目の console.log が true であることはわかっていますTeacher.prototype.__proto__ === Object.prototype。したがって、最初の console.log は false を出力するはずです。

しかし、3 番目の console.log の出力が Teacher.prototype が Teacher のインスタンスであることを示す理由がわかりません。誰かが私のためにそれを明確にすることができますか? どうもありがとう。

4

2 に答える 2

3

しかし、3 番目の console.log の出力が Teacher.prototype が Teacher のインスタンスであることを示す理由がわかりません。誰かが私のためにそれを明確にすることができますか? どうもありがとう。

Teacher.prototypeのインスタンスではないあなたの考えは問題ありませんTeacher。DevTools ビューで Teacher がどこから来たのか、知識に基づいて推測してみましょう。

var obj = new Teacher();
obj.constructor;          // function Teacher
obj.constructor.name;     // "Teacher"

var proto = Teacher.prototype;
proto.constructor;        // function Teacher
proto.constructor.name;   // "Teacher"

Chrome DevTools コンソールは.constructor.name、オブジェクトをきれいに印刷するときにチェックするように見えますが、これは合理的です。プロトタイプ オブジェクト (関数と共に作成され、 からアクセス可能.prototype) にも.constructor、関数に戻るプロパティがあります。

于 2013-04-29T17:59:39.777 に答える
1

これは、Chrome コンソールがオブジェクトを表示するために選択する方法です。オブジェクトのプロパティを調べて、constructorそのコンストラクタ関数のインスタンスであると想定します。

これは、プロトタイプ オブジェクトを除くすべてのオブジェクトで正常に機能します。これは、それらのconstructorプロパティが、作成元のコンストラクター関数ではなく、プロトタイプである関数を参照するためです。

例:

console.log(Teacher.prototype.constructor === Teacher); // logs true

// Lets overwrite the constructor
function Foo() {};
Teacher.prototype.constructor = Foo;

console.log(Teacher.prototype); 
// logs Foo {sayName: function, sayHi: function}
于 2013-04-29T17:57:01.230 に答える