1.次のようなクラスがあります。
function Person(name) {
this.name = name
}
let p = new Person('Tom');
1. p._proto_は何に等しいですか?
回答:Person.prototype
2. Person._proto_は何に等しいですか?
回答:Function.prototype
分析:
1、2は同じ問題であり、どちらもプロトタイプチェーンの知識に関連しています。1つの文を覚えておいてください。インスタンスの_proto_プロパティ(プロトタイプ)は、そのコンストラクターのプロトタイププロパティと同じです。インスタンスpのコンストラクターはPersonであり、PersonのコンストラクターはFunctionです。
類推によって理解する
var f = {}
F = function (){};
Object.prototype.a = 'value a';
Function.prototype.b = 'value b';
console.log(f.a)
console.log(f.b)
console.log(F.a)
console.log(F.b)
結果:
値a;
未定義;
値a;
値b;
分析:
fはオブジェクトのインスタンス、Fは関数のインスタンス、オブジェクトのプロパティはプロトタイプチェーンに沿ってレイヤーごとに検索されます。見つからない場合は、定義されません。
3.ステムをに変更した場合
function Person(name) {
this.name = name
return name
}
let p = new Person('Tom')
Personのインスタンス化中に、Personは何を返しますか(またはpは何に等しいですか)?
回答:
{name: "Tom"}
4.ステムをに変更した場合
function Person(name) {
this.name = name
return {}
}
let p = new Person('Tom');
Personのインスタンス化中に、Personは何を返しますか(またはpは何に等しいですか)?
{}
分析:
コンストラクターは明示的な戻り値を必要としません。newを使用してオブジェクトを作成する場合(コンストラクターを呼び出す)、戻り値が非オブジェクト(数値、文字列、ブール値など)の場合、戻り値は無視されます。戻り値がオブジェクトの場合、オブジェクトが返されます(注:return nullも戻り値は無視してください)。
5.typeofとinstanceofの違い
JavaScriptでは、typeof演算子を使用して変数のタイプを判別することがよくあります。typeof演算子を使用して参照タイプを使用して値を格納すると、問題が発生します。参照されるオブジェクトのタイプに関係なく、常に「object」が返されます。
instanceof演算子は、オブジェクトのプロトタイプチェーンにコンストラクターのプロトタイププロパティがあるかどうかをテストするために使用されます。構文:object instanceofコンストラクターパラメーター:object(検出されるオブジェクト)constructor(コンストラクター)説明:instanceof演算子は、パラメーターオブジェクトのプロトタイプにconstructor.prototypeが存在するかどうかを検出するために使用されます。
6. StudentがPersonから継承する場合(StudentクラスはPersonを継承し、プロトタイプに基づく継承である必要があります)、s = new Student( 'Lily')とすると、Personのインスタンスは何を返しますか?
function Person(name) {
this.name = name
}
function Student() {
}
Student.prototype = Person.prototype;
Student.prototype.constructor = Student;
let s = new Student('Tom');
console.log(s instance Person);
答え:本当
7.newおよびinstanceofの内部メカニズム
1. 创建一个新对象,同时继承对象类的原型,即Person.prototype;
2. 执行对象类的构造函数,同时该实例的属性和方法被this所引用,即this指向新构造的实例;
3. 如果构造函数return了一个新的‘对象’,那么这个对象就会取代真个new出来的结果,如果构造函数没有return对象,那么就会返回步骤1所创建的对象,即隐式返回this。(一般情况下构造函数不会返回任何值,不过在一些特殊情况下,如果用户想覆盖这个值,可以选择返回一个普通的对象来覆盖)